将变量从视图传递到布局的局部视图

时间:2010-05-07 18:40:30

标签: ruby-on-rails layout views partial-views

我正在尝试使用partial来渲染应用程序的菜单,根据局部变量(tab)使用CSS大写'tab':

  <%= link_to "employees", jobs_path, :class => (tab=="employees" ? "selected":"unselected") %>
  <a class="unselected">jobs</a>
  <%= link_to "tags", tags_path, :class => (tab=="tags" ? "selected":"unselected") %>

部分嵌入在应用程序的布局中:

<body>
...
<!-- tab variable needs to be set in the view, not the layout -->
<%= render :partial => "layouts/primary_menu", :locals => { :tab => "profiles" } %>
...
</body>

不幸的是,我需要在视图中设置变量的值,但该变量不可用。我应该使用:content_for符号而不是:locals?

在某些时候,我可能想要将模型实例变量传递给partial,因此解决方案需要灵活。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

我认为有多种方法可以解决这个问题,这里有一个 - 不一定是最好的

<!-- layout -->
<body>
    <%= yield(:tabs_navigation) %>
    ...
</body>

<!-- views -->
<%- tabs_navigation(render :partial => "layouts/primary_menu", :locals => { :tab => "profiles" }) %>

另一种方式 - 使用成员变量而不是本地人(这有点像作弊 - 但有效)

<!-- layout -->
<body>
    <%= render :partial => "layouts/primary_menu" %>
    ....
</body>

<!-- views -->
<%- @current_tab = "profiles" %> 

现在直接在primary_menu部分

中访问@current_tab

使用content_for

<!-- layout -->
<body>
    <%= yield(:tabs_navigation) %>
    ...
</body>

<!-- views -->
<%- content_for :tabs_navigation do -%>
    <%= render :partial => "layouts/primary_menu", :locals => { :tab => "profiles" } %>
<%- end -%>

http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield

答案 1 :(得分:2)

我决定使用link_to_unless_current UrlHelper:

<%= link_to_unless_current "enroll", enroll_path, :class => "unselected" do
    link_to "enroll", enroll_path, :class => "selected"
end %>