使用 Rails 助手渲染部分

Posted

技术标签:

【中文标题】使用 Rails 助手渲染部分【英文标题】:Using Rails helpers to render partials 【发布时间】:2012-01-31 19:31:19 【问题描述】:

据我了解,助手主要用于从某些特定于视图的逻辑中清理视图。

但在我目前的新项目(遗留应用程序)中,我偶然发现了很多看起来像这样的助手

def itemprepare
  render :partial => 'items/itemlist_summary'
end

这是正确的吗?在我看来,渲染一个部分似乎是您想要在视图中执行的操作,因为它不包含任何需要抽象的逻辑。

我应该只内联所有这些助手吗?

【问题讨论】:

【参考方案1】:

就像 Ajedi32 所说,部分使用属于视图,但有时在帮助程序中使用它们很有用。我希望展示我在我的应用程序中所做的事情是有用的:

我一直在关注优秀的文章Thinking of Rails Helper to help DRY our view。我正在使用带有固定页眉、导航栏、导航面板和页脚的 Jquery Mobile。

在每个页面中我都需要包含页脚和导航面板,所以通常应该是:

  <div data-role="footer">
    <h4>Page Footer</h4>
  </div><!-- /footer -->
  <%= render "shared/nav_panel" %>
</div><!-- /page -->

在每一页的末尾。

然后我将渲染部分重构到应用程序助手中,现在是:

  # app/helpers/application_helper.rb
  def page_footer
    footer = content_tag :div , :"data-role" => "footer" do
      content_tag :h4, "Page Footer"
    end
    nav_panel = render(:partial => 'shared/nav_panel')
    footer + nav_panel
  end

在视图中我只是调用:

<%= page_footer %>

这只是一个简短的例子;实际上,该应用程序的页脚会根据登录状态、用户语言等而变化。

【讨论】:

【参考方案2】:

虽然您通常不应该使用辅助方法来呈现部分,但我可以看到在某些情况下可能是必要的。对于这些情况,您需要使用concat 方法:

def itemprepare
  concat(render(:partial => 'items/itemlist_summary'))
end

【讨论】:

正是我想要的:)【参考方案3】:

渲染部分不属于助手。助手应该帮助你做包含逻辑的事情。逻辑不属于控制器,除非它是渲染部分并决定是否应该显示某些内容的逻辑。

【讨论】:

【参考方案4】:

我们的项目中有几个这样的助手,但大多数都在我们的自定义 gem 中。用辅助函数包装部分渲染可以防止应用程序知道信息是如何呈现的,只要它呈现视图的请求部分,我们就可以轻松地扩展逻辑、更改局部或在这个辅助函数中做任何我们想做的事情。有时这些部分需要一些驻留在 gem 本身内部的数据,并且不需要将其公开给应用程序。所以应用程序调用辅助方法(有时根本没有任何参数),形成所需的参数和局部变量并将它们传递给部分。

但是,当您只是在应用程序中渲染局部并且不需要围绕该渲染的任何扩展逻辑时,我认为为每个局部创建新的帮助器没有多大用处。

【讨论】:

以上是关于使用 Rails 助手渲染部分的主要内容,如果未能解决你的问题,请参考以下文章

rails改变部分集合渲染的路径

通过渲染 Rails 部分创建 jquery html 对象

将 Rails 部分渲染到图像

Rails 设计多态 - 使用 Ajax 获取部分渲染

Rails - 为部分渲染布局

将外键传递给 Rails 中的部分渲染