仅在特定条件下更改布局

时间:2012-04-15 09:40:10

标签: ruby-on-rails layout

在我的宝石中,我只想在某种条件下更改布局。

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

谢谢!

2 个答案:

答案 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/目录。仅供考虑......