Rails условные ('if') операторы, основанные на действиях контроллера
Может быть, лучший способ сделать это, но я пытаюсь сделать инструкцию if в rails на основе текущего действия в контроллере (это будет использоваться в представлении).
Например, если на странице редактирования или на странице просмотра и т.д. мне нужен другой стиль для чего-то - есть ли инструкция if, которая может указать это?
(Мне нужен оператор if, потому что он используется в частичном, на нескольких страницах).
Спасибо!
Эллиот
Ответы
Ответ 1
Хэш params
, доступный в контроллере, содержит ключи :controller
и :action
, которые определяют имя контроллера и имена действий запроса.
Поэтому вы могли бы сказать
if params[:action] == "foo"
# Show stuff for action 'foo'
elsif params[:action] == "bar"
# Show stuff for action 'bar'
elsif ...
# etc.
end
Ответ 2
Нехорошо, чтобы IMO получала частичные запросы о том, что такое текущий контроллер и имена действий. Подумайте "скажите, не спрашивайте" (http://www.pragprog.com/articles/tell-dont-ask). То есть, вместо того, чтобы частично спросить его о своем состоянии, сообщите частичное, что вы хотите, чтобы он делал.
Один из способов сделать это - передать переменные частичным через опцию locals
:
<%= render :partial => "/common/toolbar", :locals => {:edit => true} %>
Тогда в частичном:
<% if defined?(edit) && edit %>
... stuff appropriate to edit mode
<% end %>
Ответ 3
Вы можете сделать это следующим образом:
class ApplicationController < ActionController::Base
layout :set_layout
def set_layout
case params[:action]
when "foo"
"foo_layout"
when "bar"
"bar_layout"
...
else
"default_layout"
end
end
...
end
надеюсь, что это поможет =)
Ответ 4
Вы также можете использовать макеты для частичных:
<%= render :partial => 'some_partial', :layout => 'wrap_with_stuff' %>
Если вы хотите определить, какой макет использовать динамически, я бы поставил его в помощнике. Таким образом, вы получите
# In your view
<%= render :partial => 'some_partial', :layout => layout_for_my_partial %>
# In your helper
def layout_for_my_partial
params[:action] == 'show' ? 'show_wrapper' : 'everything_else_wrapper'
end
Это будет работать только в некоторых обстоятельствах, но может быть тем, что вы пытаетесь сделать.
Подробнее см. здесь.
http://ryandaigle.com/articles/2007/8/3/what-s-new-in-edge-rails-partials-get-layouts