我有一个控制器:
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
了吗?
答案 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,模块不需要知道包含类的具体名称,只需要知道它的引用。