仅在特定条件下更改布局

Tim*_*aas 3 layout ruby-on-rails

在我的宝石中,我只想在特定条件下更改布局.

我知道我可以有一个指定布局的方法,但是如何指向该方法中的当前布局?我已经知道_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
Run Code Online (Sandbox Code Playgroud)

例如:具有此gem的应用程序指定了一个名为'qday'的布局,现在如果路径包含'baco',gem需要更改布局,但如果没有,则应该渲染'qday'.

谢谢!

Mar*_*rce 8

您似乎要做的是始终设置布局,如果您不想更改它,请将其设置为已有的布局.相反,由于递归,我认为你应该只在条件成立时设置布局.

before_filter set_baco_layout

def set_baco_layout
  self.class.layout "baco" if request.path_info.include?( '/baco/' )
end
Run Code Online (Sandbox Code Playgroud)

然而,如果您的引擎控制器每个都称为布局,那将是一个更简洁的设计.

class Baco::BatsController < ApplicationController
  layout "baco"
  ...
Run Code Online (Sandbox Code Playgroud)

这可能看起来不干净,但它是一个更干净的步骤.

为了修复DRY,我使用了继承.有一个基本控制器类,用于设置布局并从您的基础继承您的其他控制器.

class Baco::BaseController < ApplicaitonController
  layout "baco"
end

class Baco::BatsController < Baco::BaseContoller
  ...
Run Code Online (Sandbox Code Playgroud)