如何在RoR的视图中正确地重构一个简单的if else逻辑

时间:2015-01-17 02:29:09

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

我是Rails的新手,我无法解决视图中的重构逻辑问题。假设我有一个简单的Post模型。在索引视图中,如果有帖子,我希望显示特定内容。基本上,如果有任何帖子,则显示此特定内容或其他内容。

以下是我对帖子的index.html.erb视图:

<div class="content">
 <% if @posts.any? %>
 <table>
     <thead>
       <tr>
         <th>Title</th>
         <th>Content</th>
       </tr>
     </thead>
     <tbody>
       <% @posts.each do |post| %>
         <tr>
           <td><%= post.title %></td>
           <td><%= post.content %></td>              
         </tr>
       <% end %>
     </tbody>
   </table>
 <% else %>
 <p>There are no posts!</p>
 <% end %>
</div>

现在,我重构的方式是创建一些帮助器和部分组件,如下所示:

posts_helper.rb(根据if逻辑呈现部分):

module PostsHelper

 def posts_any
  if @posts.any?
    render 'this_content'
  else
    render 'this_other_content'
  end
 end

end

在partials中,我只使用了if else语句中的确切内容。

_this_content.html.erb partial:

<table>
   <thead>
     <tr>
       <th>Title</th>
       <th>Content</th>
     </tr>
   </thead>
   <tbody>
     <% @posts.each do |post| %>
       <tr>
         <td><%= post.title %></td>
         <td><%= post.content %></td>              
       </tr>
     <% end %>
   </tbody>
 </table>

_this_other_content.html.erb partial:

<p>There are no posts!</p>

最后,重构的index.html.erb(将调用辅助方法):

<div class="content">
 <%= posts_any %>
</div>

问题是,我只是不相信这是正确的Rails重构方式。如果你们中的任何人能够对此有所了解,我将非常感谢! 谢谢!

1 个答案:

答案 0 :(得分:6)

你做得对,并且比我认识的许多人更好。 :)

一些小的调整......

我会将render从帮助器移动到erb,只需使用帮助器返回正确呈现的名称。

您的erb代码和帮助程序代码:

<%= posts_any %>

def posts_any
  if @posts.any?
    render 'this_content'
  else
    render 'this_other_content'
  end
end

我建议:

<%= render posts_any %>

def posts_any
  @posts.any? ? 'this_content' : 'this_other_content'
end

接下来,我个人喜欢使用部分渲染集合。

此致:

 <% @posts.each do |post| %>

我建议:

<%= render partial: "post", collection: @posts %>

在下面的评论中,用户kyledecot建议甚至更加谨慎:

<%= render @posts %>

然后像这样创建文件_post.html.erb

<tr>
  <td><%= post.title %></td>
  <td><%= post.content %></td>              
</tr>

有些开发人员认为,如果部分不在其他地方使用,则使用部分渲染集合会有些过分。

我个人认为它有用,当项目有多个编码器时,尤其有用,其中一些编码器可能会更改表行数据结果。