Отрисовка макета для определенных действий

Здесь у меня есть контроллер с 4 действиями, и я хочу применить макет приложения (макет по умолчанию) только к новому действию, или, другими словами, я хочу исключить только индексное действие из макета, поэтому я пишу это, но это не работает, index шаблон рендерится с макетом.

class SessionsController < ApplicationController

    layout 'application', :except => :index

    def index
    end 

    def new
    end


    def create
        end
    end

    def destroy
    end

end

также я пытался

layout 'application', :only => :new

но это тоже не работает, та же проблема, что и шаблон индекса с макетом. любые предложения, в чем проблема здесь?


person Azzurrio    schedule 28.03.2012    source источник


Ответы (2)


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

layout :my_layout

def my_layout
  params[:action] == 'new' ? 'application' : nil
end
person shingara    schedule 28.03.2012
comment
Ну работает!! но есть ли у вас какие-либо идеи, почему макет «приложение», :except =› :index не работает ?? Кстати, таким образом макет «false», :except =› :new тоже работает - person Azzurrio; 28.03.2012
comment
я думаю, это потому, что в моем случае я фиксирую макет на nil во всех случаях вместо нового действия. Но при использовании :except или :only в другом случае используется унаследованный макет. - person shingara; 28.03.2012

Вот код, который вы можете использовать в своих контроллерах:

layout :resolve_layout
...
...

private

def resolve_layout
  if %w(index show).include?(action_name)
    "application"
  elsif %w(show).include?(action_name)
    "admin"
  else
    "generic"
end

По сути, относитесь к этим массивам как к операторам :only для макета, который вы им даете, если они оцениваются как истинные по сравнению с текущим action_name.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что это позволяет: только,: кроме и т. д.

person instinctious    schedule 28.03.2012