使用Rails辅助方法渲染局部视图

13

据我所知,帮助器主要用于清理视图中的一些特定于视图的逻辑。

但是在我目前的新项目(旧的应用程序)中,我遇到了很多看起来像这样的帮助器:

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

这样做是否正确?在我看来,呈现一个部分视图似乎是你希望在视图中完成的事情,因为它不包含需要抽象化的任何逻辑。

我应该只内联所有这些辅助函数吗?

4个回答

10

在帮助程序中,不应该包含呈现局部视图的内容。帮助程序应该帮助你执行包含逻辑的操作。除非是渲染局部视图并决定是否显示某些内容的逻辑,否则逻辑不应该存在于控制器中。


8

虽然通常不应该使用助手方法来渲染部分视图,但我可以理解在某些情况下可能是必要的。对于这些情况,您需要使用 concat 方法:

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

正是我所需要的 :) - Atul Yadav

1

正如Ajedi32所说,partials属于视图,但有时在helpers中使用它们很有用。我希望展示一下我在我的应用程序中所做的:

我一直在遵循这篇优秀的文章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 %>

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

0
我们的项目中有一些类似的辅助函数,但大部分都在我们的自定义 gem 中。使用 helper 包装 partial 渲染可以防止应用程序知道信息是如何呈现的,并且只要它呈现视图的请求部分,我们就可以轻松扩展逻辑、更改 partial 或在此 helper 内执行任何操作。有时这些 partial 需要一些存储在 gem 中的数据,而无需将其暴露给应用程序。因此,应用程序调用 helper 方法(有时根本不需要任何参数)来形成所需的参数和局部变量,并将它们传递给 partial。
但是,当您仅在应用程序中呈现 partial 且不需要任何复杂的渲染逻辑时,我认为没有必要为每个 partial 创建新的 helper。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接