使用Rails助手来渲染部分

时间:2012-01-02 12:22:16

标签: ruby-on-rails ruby model-view-controller view

根据我的理解,帮助程序主要用于从某些特定于视图的逻辑中清除视图。

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

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

这是对的吗?渲染部分对我来说似乎是你想要在视图中做的事情,因为它不包括任何需要抽象的逻辑。

我应该只是内联所有帮助者吗?

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

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

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

答案 2 :(得分: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 -->

在每页的末尾。

然后我将render partial重构为应用程序助手,现在它是:

  # 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 %>

这只是一个简短的例子;实际上,应用程序的页脚会根据登录状态,用户语言等进行更改。

答案 3 :(得分:0)

我们的项目中有几个这样的助手,但大多数都在我们的自定义宝石中。使用帮助程序包装部分呈现可防止应用程序知道信息的呈现方式,只要呈现请求的视图部分,我们就可以轻松地扩展逻辑,更改部分或在此帮助程序中执行任何操作。有时这些部分需要一些驻留在gem本身内部的数据,并且不需要将它暴露给应用程序。所以应用程序调用helper方法(有时根本没有任何参数),形成所需的参数和locals并将它们传递给partial。

但是当你只是在你的应用程序中部分呈现并且你不需要任何关于该呈现的广泛逻辑时,我认为从为每个部分创建新助手时没有多大用处。