参见英文答案 >
When to use Helpers instead of Partials6
我需要关于DRYing视图代码的最佳做法的建议.
我的应用程序中有三个类(NewsItem,RSSItem和BlogItem),它们使用单独的视图,但在其中包含类似的部分.其中一个部分是这样的:
我需要关于DRYing视图代码的最佳做法的建议.
我的应用程序中有三个类(NewsItem,RSSItem和BlogItem),它们使用单独的视图,但在其中包含类似的部分.其中一个部分是这样的:
<% if current_user %> <footer> <%= marks_bar(@item) %> <%= favorite_button(@item,"blog_item") || delete_from_favorite_button(@item,"blog_item") %> <%= share_button(@item) %> <% if current_user.is_mine?(@item) %> <div><%= link_to "Edit",edit_user_blog_item_path(current_user,@item) %></div> <% end %> </footer> <% end %>
所有这三个班级几乎相等,所以我决定把它带到一个不同的地方.在这里我很困惑:我应该使用部分或帮助方法吗?
我知道帮助器主要用于将ruby代码与HTML分离,但在这种情况下,帮助器将如下所示:
def toolbar_for(item,type_str,edit_path) if current_user content_tag(:footer) do |b| marks_bar(item).to_s << (delete_from_favorite_button(item,type_str) || favorite_button(@item,type_str)).to_s << share_button(@item).to_s << (content_tag(:div) { link_to("Edit",edit_path)} if current_user.is_mine?(@item)).to_s end end end
所以这里几乎没有HTML代码.
你能给我建议,你认为什么方法更好,为什么?此外,这些方法中是否存在一些性能问题(例如,多个字符串连接或频繁的部分加载可能是昂贵的)? (这个程序相当高负载)
解决方法
我会说这是一个很好的例子.
我预留助手来生成任意动态内容.这是一个松散的描述,所以一个例子如何:我会做一个帮助器,分割一个ActiveRecord对象数组,并将它们显示为N列.在这种情况下,传递的对象的结构以某种方式被利用,以便生成内容,但内容本身并不重要.如果你想到,form_for也适合这个描述.
相反,部分内容对于“静态”内容是非常好的,需要在多个页面上重复使用.例如,您将创建一个部分来渲染单个项目.部分确定特定项目的“静态”表示.
在我看来,你的例子更适合第二个垃圾桶.由于@item没有被操纵以生成内容,实际上它几乎不被使用.似乎这个帮手大多是其他适当创建的助手的粘贴代码(share_button和marks_bar).完美的用例为部分!