在我看来,我这样做:
<% 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 !@post.parent.nil? %>
<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
。即案件陈述不起作用。
我知道我可以简单地做一些脱节的if语句,但是围绕它的HTML有点奇怪。
有没有办法可以用CASE语句做到这一点?
修改1
if
语句不能正常工作的原因是,如果我有3个if
语句背靠背 - 没有一个语句相互交互(这是循环所有语句的唯一方法) (适当的条件)是else
没有正确触发。
E.g。如果前两个条件为真,但第三个条件不是......它将打印出"there are no related posts"
...当情况并非如此。在这种情况下,没有parent
个帖子。
基本上我只想拥有一个全能related
帖子,所以我只是遍历所有各种选项并检查这些关系是否存在。如果他们这样做,我将他们拉出来,如果他们不这样做,他们继续前进。如果不存在,那么我不打印“没有相关的帖子”。
答案 0 :(得分:3)
视图看起来看起来看起来很复杂这一事实表明,将逻辑重构出视图并将其置于Post模型所属的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 %>
paritals:
<%# 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
我知道这并没有直接回答你的问题,但恕我直言,我认为这是一个更好的解决方案。
答案 1 :(得分:1)
这里有两个选择。
使用 IF ELSIF
<% if @post.has_children? %>
<% @post.children.each do |child| %>
<li><%= link_to child.title, post_path(child)%></li>
<% end %>
<% elsif @post.has_siblings? %>
<% @post.siblings.where.not(id: @post.id).each do |sibling| %>
<li><%= link_to sibling.title, post_path(sibling)%></li>
<% end %>
<% elsif !@post.parent.nil? %>
<li><%= link_to @post.parent.title, post_path(@post.parent) %></li>
<% else %>
</ul>
</p>
<p>
There are no related posts.
</p>
<% end %>
使用 only case 作为doz提及
<% case
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 !@post.parent.nil? %>
<li><%= link_to @post.parent.title, post_path(@post.parent) %></li>
<% else %>
</ul>
</p>
<p>
There are no related posts.
</p>
<% end %>
答案 2 :(得分:0)
你可以用case语句来做。只给案例没有参数。例如,而不是case @post
只使用case
这相当于if语句。并且应该为你想要实现的目标而努力
查看ruby case statements了解一些例子