select_layout实现Ruby元编程

时间:2011-06-21 19:30:48

标签: ruby-on-rails ruby programming-languages metaprogramming

如何实现“select_layout”方法,以便我可以转换此代码:

class Cpu::ContextsController < Cpu::ApplicationController

  layout :select_layout

  private

  def has_resource?
    true # dummy
  end

  def select_layout
    has_resource? ? 'cpu/context' : 'cpu/account'
  end
end

class Cpu::ContextsController < Cpu::ApplicationController
  select_layout do
    has_resource? ? 'cpu/context' : 'cpu/account'
  end
end

更新:以下解决方案足够好;)

  before_filter do
    self.class.send(:layout, has_resource? ? 'cpu/context' : 'cpu/account')
  end

2 个答案:

答案 0 :(得分:1)

如果要动态更改布局,请使用render ..., :layout => has_resource? ? "cpu/context" : "cpu/account"layout是一种类方法,用于指定方法集的布局。

答案 1 :(得分:0)

找不到has_resource,因为has_resource被定义为实例方法,select_layout方法被定义为类方法。