Подтвердить что ты не робот

Rails условные ('if') операторы, основанные на действиях контроллера

Может быть, лучший способ сделать это, но я пытаюсь сделать инструкцию if в rails на основе текущего действия в контроллере (это будет использоваться в представлении).

Например, если на странице редактирования или на странице просмотра и т.д. мне нужен другой стиль для чего-то - есть ли инструкция if, которая может указать это?

(Мне нужен оператор if, потому что он используется в частичном, на нескольких страницах).

Спасибо!

Эллиот

4b9b3361

Ответ 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