【问题标题】:DRYing rails view: partial vs helper [duplicate]DRYing rails 视图:部分 vs 助手 [重复]
【发布时间】:2023-03-22 21:22:01
【问题描述】:

我需要有关 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 代码。

您能否给我建议,您认为哪种方法更好,为什么?此外,这些方法是否存在一些性能问题(例如多个字符串连接或频繁的部分加载可能代价高昂)? (这个应用程序是相当高负载的)

【问题讨论】:

    标签: ruby-on-rails view refactoring dry


    【解决方案1】:

    我会说这是一个很好的局部例子。

    我保留用于生成任意动态内容的助手。这是一种松散的描述,所以举个例子吧:我将创建一个帮助器,它将 ActiveRecord 对象数组拆分并将它们显示为 N 列。在这种情况下,传递对象的结构以某种方式被利用以生成内容,但内容本身并不重要。仔细想想,form_for 也符合这个描述。

    相反,部分内容非常适合需要在多个页面上重复使用的“静态”内容。例如,您将创建一个部分来呈现单个项目。部分确定特定项目的“静态”表示。

    在我看来,您的示例更适合第二个垃圾箱。由于@item 没有被操纵来生成内容,实际上它几乎没有被使用。似乎这个助手主要是其他适当创建的助手(share_buttonmarks_bar)的粘合代码。部分的完美用例!

    【讨论】:

      【解决方案2】:

      我会为此使用部分视图。好的经验法则:如果 HTML 是输出,则使用部分。 Helpers 不是 Rails 应用程序的垃圾箱——它们应该真正用于输出数据,而不是演示。虽然我通常建议人们避开一般的助手,而支持演示者,它们在 Rails 世界中被充分利用。

      【讨论】:

      • 好吧,实际上我不认为“如果 HTML 是输出,则使用部分”是唯一的真理。事实上,form_for、link_to 等 - 也是助手。
      • 不,这当然不是对此事的唯一意见。当然,这种模式在一些地方得到了成功的使用,包括表单构建器。但如果你问的是哪个更合适而不是你自己的直觉,我谦虚地认为,partials 是一种更简单、更直接的方法,从长远来看更易于维护。
      • 感谢您的意见,但我认为这是相当主观的。我认为辅助方法和部分方法的可维护性比较更多的是每个开发人员的口味,直到我会看到更多客观的论点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多