【问题标题】:How to vary a helper called within a Rails 3 layout, depending on the controller如何根据控制器改变在 Rails 3 布局中调用的帮助程序
【发布时间】:2010-10-01 21:24:28
【问题描述】:

我对多个控制器使用相同的布局,在这个布局中我包含一个使用助手调用的菜单,如下所示:

<%= side_menu %>

我想做的是根据调用布局的控制器来改变 side_menu 的内容。在理想情况下,我可以在 application_controller.rb 和其他帮助文件中定义 side_menu,然后根据控制器选择适当的帮助;换句话说,是这样的:

# application_helper.rb
def side_menu
  "generic menu This goes here"
end

# users_helper.rb
def side_menu
  "menu for users goes here"
end

# guests_helper.rb
def side_menu
  "menu for guests goes here"
end

这不起作用,因为在 Rails 3 中,所有帮助文件都已加载,我无法控制实际调用哪个 side_menu。如果有一个选项来加载 only application_helper.rb 和特定于控制器的帮助程序,那就太好了,但还没有(目前)。

根据控制器改变助手内容的最佳方法是什么?我目前在 application_helper.rb 中定义 side_menu 一次,然后检查控制器以查看要添加的内容。这感觉不对,因为这个问题几乎需要一个子类和覆盖的答案——由于 Rails 3 的“helper :all”行为,我不能这样做。建议?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    您可以在控制器中定义此方法并添加:

    helper_method :side_menu
    

    但也许不同的解决方案会更好。我认为您可以在每个控制器视图文件夹中添加_side_menu.html.erb,当您调用&lt;%= render :partial =&gt; 'side_menu' %&gt; 时,它应该根据当前控制器查找不同的文件(但请记住为所有控制器添加此文件)。

    或者您可以混合使用这两种方法。将此辅助方法添加到控制器并在其中呈现正确的文件。这样会更好,因为您会获得一些默认的侧边菜单,并且当控制器没有部分侧边菜单时它不会崩溃。

    您也可以在布局中添加&lt;%= yield :side_menu %&gt;,如果您想在侧边菜单中添加内容,只需添加&lt;% content_for :side_menu do %&gt; bla bla bla &lt;% end %&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多