如何让这个案例陈述起作用?

时间:2014-11-27 06:55:26

标签: ruby-on-rails ruby-on-rails-4

在我看来,我这样做:

<% 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帖子,所以我只是遍历所有各种选项并检查这些关系是否存在。如果他们这样做,我将他们拉出来,如果他们不这样做,他们继续前进。如果不存在,那么我不打印“没有相关的帖子”。

3 个答案:

答案 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了解一些例子