Передать переменную из представления в частичное представление макета

Я пытаюсь использовать частичное отображение меню приложения, используя «вкладку» с заглавной буквы с помощью CSS на основе локальной переменной (вкладки):

  <%= 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?

В какой-то момент мне может понадобиться передать переменную экземпляра модели в партиал, поэтому решение должно быть гибким.

Есть ли лучший подход?


person craig    schedule 07.05.2010    source источник


Ответы (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" %> 

теперь доступ к @current_tab непосредственно в партиале primary_menu

Использование 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

person house9    schedule 07.05.2010
comment
добавлено content_for например; довольно многословно, когда вы просто хотите изменить значение одной переменной - person house9; 08.05.2010

Я решил использовать link_to_unless_current UrlHelper:

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