3

在我的 gem 中,我只想在特定条件下更改布局。

我知道我可以有一个指定布局的方法,但是我怎样才能在那个方法中指向当前布局呢?我知道它_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'。

谢谢!

4

2 回答 2

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
  ...
于 2012-04-15T11:47:51.777 回答
-1

尝试:

before_filter only: [:index, :show, :edit, :new] do
  render layout: 'baco' if request.path_info.include? '/baco/'
end

顺便说一句,Rails 允许您在不编码的情况下使用每个控制器的布局。只需在您的控制器之后命名它,但controller在末尾没有(如users.html.haml)并将其放入您的/views/layouts/目录。只是为了考虑...

于 2012-04-15T11:31:58.203 回答