我是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重构方式。如果你们中的任何人能够对此有所了解,我将非常感谢! 谢谢!
答案 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>
有些开发人员认为,如果部分不在其他地方使用,则使用部分渲染集合会有些过分。
我个人认为它有用,当项目有多个编码器时,尤其有用,其中一些编码器可能会更改表行数据结果。