私の見解では、私はこれを行っています:
<% case @post
when @post.has_children? %>
<% @post.children.each do |child| %>
<li><%= link_to child.title, post_path(child)%></li>
<% end %>
<% when @post.has_siblings? %>
<% @post.siblings.where.not(id: @post.id).each do |sibling| %>
<li><%= link_to sibling.title, post_path(sibling)%></li>
<% end %>
<% when [email protected]? %>
<li><%= link_to @post.parent.title, post_path(@post.parent) %></li>
<% else %>
</ul>
</p>
<p>
There are no related posts.
</p>
<% end %>
基本的にやりたいのは@post
、いろいろな状態をチェックしたいです。もしそうならhas_children?
、それならhas_siblings?
、など。
上記のいずれかが真または偽の場合、ステートメントを終了させたくありません。
ビューが読み込まれると、これらすべてのステートメントを自動的にチェックする必要があります。上記のいずれかに該当する場合は、チェックのすぐ下でコマンドを実行する必要があります。
問題は、これを行うと、常にデフォルトでになりelse
ます。つまり、caseステートメントは機能しません。
ばらばらのifステートメントを単純に実行できることはわかっていますが、その周りのHTMLは少し奇妙になります。
CASEステートメントでこれを行う方法はありますか?
編集1
if
ステートメントが正しく機能しない理由は、3つのif
ステートメントが連続している場合です-それらのいずれも相互作用しません(これがすべての条件を適切に循環する唯一の方法です)、がelse
トリガーされないためです正しく。
たとえば、最初の2つの条件が真であるが、3番目の条件が真で"there are no related posts"
ない場合は...印刷されます...そうでない場合。parent
投稿がない場合です。
基本的には、すべてを網羅したrelated
投稿が必要なので、さまざまなオプションをすべて繰り返して、それらの関係が存在するかどうかを確認します。もしそうなら、私はそれらを引き出しています、そして、そうでなければ、彼らは先に進みます。存在しない場合は、「関連する投稿はありません」とは印刷しません。
ビューがすでに複雑に見えているという事実は、ビューからロジックをリファクタリングして、それが属するPostモデルに配置することをお勧めすることを示しています。理想的には、ビューは次のようになります。
<%# posts/show.html.erb %>
<% if @post.has_related_posts? %>
<%= render partial: 'children', collection: @post.children, as: :child %>
<%= render partial: 'siblings', collection: @post.other_siblings, as: :sibling %>
<%= render partial: 'parent', locals: {parent: @post.parent}%>
<% else %>
<p>There are no related posts</p>
<% end %>
パリタル:
<%# posts/_children.html.erb %>
<li><%= link_to child.title, post_path(child)%></li>
<%# posts/_sibling.html.erb %>
<li><%= link_to sibling.title, post_path(sibling)%></li>
<%# posts/_parent.html.erb %>
<% unless parent.nil? %>
<li><%= link_to parent.title, post_path(parent) %></li>
<% end %>
次に、Postモデルはロジックを整理できます。
class Post < ActiveRecord::Base
def has_related_posts?
!children.to_a.empty? || !other_siblings.to_a.empty? || !parent.nil?
end
def children
self.children || [] # Rails does this automatically, but just for the example
end
def other_siblings
self.siblings.where.not(id: self.id)
end
#...
end
これがあなたの質問に直接答えないことは知っていますが、私見ではそれがより良い解決策だと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加