将模块包含在控制器中

时间:2014-04-20 05:44:20

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个控制器:

class MyController < ApplicationController
  PAGE_SIZE = 33
  include MyModule

  #....
  method123

end

module MyModule
  def method123
    # .....
    a = PAGE_SIZE
  end
end

它会抛出错误:uninitialized constant MyModule::PAGE_SIZE

PAGE_SIZE中不应显示MyModule,因为在MyController中定义MyModule之后包含PAGE_SIZE了吗?

3 个答案:

答案 0 :(得分:1)

不,如前所述,这是不可能的。

但要克服这一点,你可以在类中使用get函数并在模块中使用它,你的代码将是这样的: -

class MyController < ApplicationController
  PAGE_SIZE = 33
  include MyModule

  #....
  method123

  def get_page_size
    PAGE_SIZE    
  end
end

module MyModule
  def method123
    # .....
    a = get_page_size
  end
end

答案 1 :(得分:1)

OOP方法的一个更好的设计是,该模块自己解决了大部分依赖关系。因此,模块应该在需要时处理页面大小。页面大小更好的方法而不是常量。

module MyModule
  def demo_method
    do_something_on page_size
  end

  def page_size
    33
  end
end

或者,如果page_size真的应该是子类的工作:

module MyModule
  def page_size
    raise "Implement it if including me!"
  end
end

继承此模块的类可以自由覆盖page_size,或者必须将其覆盖为上面的第二个代码块。

class MyController
  include MyModule

  def index
    demo_method
  end

  private
  def page_size
    30
  end
end

答案 2 :(得分:1)

我认为你应该重新考虑你的OOP设计,但这是你如何得到你想要的:

module MyModule
  def method123
    self.class.const_get("PAGE_SIZE")
  end
end

使用#const_get,模块不需要知道包含类的具体名称,只需要知道它的引用。