【问题标题】:Avoiding repetitive "content_for" in views避免视图中重复的“content_for”
【发布时间】:2011-01-10 11:55:28
【问题描述】:
我的布局中放置了一个子菜单,该子菜单因控制器而异,但在每个控制器方法视图之间却不同。我目前正在做的事情如下:
<% content_for( :submenu ) do %>
<%= render :partial => 'submenus/correct_submenu' %>
<% end %>
在方法的每个视图中
然后我的应用程序布局中有这个
<%= yield :submenu %>
但是,这感觉有点重复,对每个视图都这样做。每个控制器有没有办法做到这一点?
【问题讨论】:
标签:
ruby-on-rails
actionview
actioncontroller
【解决方案1】:
我的建议是为此制定一个约定,因此如果您有ProductsController,那么子菜单将为submenus/products_menu。这样你就可以编写一个看起来像这样的助手:
def render_submenu
content_for(:submenu) { render :partial => "submenus/#{controller.controller_name}_menu" }
end
然后您可以通过以下方式调用它:
<%= render_submenu %>
然后,您可以将其设为子菜单的默认 content_,并且仅在需要不同时指定内容。
我希望这会有所帮助!
【解决方案2】:
使用nested layouts 将特定控制器的布局嵌套在应用程序布局下,方法是创建如下文件:
# app/view/layouts/<controller_name>.html.erb
<% content_for( :submenu ) do %>
<%= render :partial => 'submenus/correct_submenu' %>
<% end %>
<%= render template: "layouts/application" %>
使用此方法,您不必修改一堆视图文件。