在我的宝石中,我只想在某种条件下更改布局。
我知道我可以有一个指定布局的方法,但是如何指向该方法中的当前布局?我已经知道_layout
指向布局名称,但如果在指定布局的方法中调用它,则会导致堆栈溢出。
这是我的澄清代码(在我的引擎的应用程序控制器中):
layout :get_layout
def get_layout
current = _layout # this is what I want, but causes a stack overflow
request.path_info.include?( '/baco/' ) ? 'baco' : current
end
所以例如:带有这个gem的应用程序指定了一个名为'qday'的布局,现在如果路径包含'baco',gem需要更改布局,但如果没有,则应该渲染'qday'。
谢谢!
答案 0 :(得分:8)
您似乎要做的是始终设置布局,如果您不想更改布局,请将其设置为已有的布局。相反,由于递归,我认为只应在条件成立时设置布局。
before_filter set_baco_layout
def set_baco_layout
self.class.layout "baco" if request.path_info.include?( '/baco/' )
end
如果您的引擎控制器分别称为布局,那将是一个更简洁的设计。
class Baco::BatsController < ApplicationController
layout "baco"
...
这可能看起来不干净,但它更加清洁。
为了修复DRY,我使用了继承。有一个基本控制器类,用于设置布局并从基础继承其他控制器。
class Baco::BaseController < ApplicaitonController
layout "baco"
end
class Baco::BatsController < Baco::BaseContoller
...
答案 1 :(得分:-1)
尝试:
before_filter only: [:index, :show, :edit, :new] do
render layout: 'baco' if request.path_info.include? '/baco/'
end
BTW,Rails允许您使用每个控制器布局而无需编码。只需在您的控制器之后命名,但最后没有controller
(例如users.html.haml
),并将其放入/views/layouts/
目录。仅供考虑......