2015-02-28 7 views
0

В одном из моих контроллеров я хочу изменить макет, учитывая некоторые условия, и в противном случае сохранить макет по умолчанию, используемый родительским ApplicationController (было «приложение» изначально, но сейчас я пытаюсь сделать некоторые другие). Пробовал доступ к «макету» с помощью alias_method, но он, похоже, не работает. Мой код:Как получить доступ к «макету» родительского контроллера?

class SomeController < ApplicationController 
    alias_method :parent_layout, :layout 
    layout :some_layout 

    def some_layout 
    if some_condition 
     "new_layout" 
    else 
     :parent_layout 
    end 
    end 
end 

Это дает ошибку:

ActionController::RoutingError (undefined method `layout' for class `SomeController'): 
    app/controllers/some_controller.rb:6:in `alias_method' 
    app/controllers/some_controller.rb:6:in `<class:SomeController>' 
    app/controllers/some_controller.rb:3:in `<top (required)>' 

ответ

0

Похоже, у вас есть несколько вариантов. Проверьте документы здесь (поиск «находящих раскладок») http://guides.rubyonrails.org/layouts_and_rendering.html

Некоторые возможности, в зависимости от того, насколько сложным вам нужно быть:

# Proc-based 
class ProductsController < ApplicationController 
    layout Proc.new { |controller| controller.request.xhr? ? "popup" : "application" } 
end 

# Route based, :except and :only 
class ProductsController < ApplicationController 
    layout "product", except: [:index, :rss] 
end 

# Method-based 
class OldArticlesController < SpecialArticlesController 
    layout false 

    def show 
    @article = Article.find(params[:id]) 
    end 

    def index 
    @old_articles = Article.older 
    render layout: "old" 
    end 
    # ... 
end 

Я не уверен, как структурирован ваш код но похоже, что первый из них мог бы сработать для вас:

class SomeController < ApplicationController 
    layout Proc.new { |controller| controller.some_condition? ? "new_layout" : "application" } 
end 
+0

Thanks @alexcavalli. Не уверен, что это решает мою проблему. Первый предложенный вами вариант предоставляет явный файл макета для каждого случая условия. То, что я хочу сделать, это предоставить его только при некоторых условиях и в противном случае использовать его из базового класса. Это может быть «приложение», или это может быть что-то еще, что было указано в методе «макета» (или переменной) ApplicationController. Я не хочу дублировать его здесь. Как я могу заменить «приложение» выше на макет из базового ApplicationController (который может иметь свои собственные условия и т. Д., Я думаю)? – shaimo

+0

@shaimo посмотрю. В таком случае, возможно, последний будет работать? Кажется, что (я его не тестировал) он использовал бы родительский макет, если вы не установите явный макет в вызове 'render'. Хотя это может привести к некоторому беспорядку, если вам придется вставить «макет рендеринга:« new_layout »' во многих методах. – alexcavalli

Смежные вопросы