我目前正在编写一个Rails引擎,我想让它的ApplicationController
从引擎配置中指定的控制器下降。
例如,我在lib/my_engine.rb
中有以下内容:
module MyEngine
mattr_accessor :authenticated_controller
class << self
def authenticated_controller
@@authenticated_controller.constantize
end
end
end
在app/controllers/my_engine/application_controller.rb
中,我有:
class MyEngine::ApplicationController < MyEngine.authenticated_controller
#some code
end
在我的应用初始化程序中,我设置了MyEngine.authenticated_controller = 'AuthenticatedController'
。
这使我可以让我的引擎几乎不知道身份验证引擎,因为现在我的引擎需要的是一些控制器,在这种情况下为AuthenticatedController
,以提供current_user
的方法。我使用this blog post作为灵感。
这一切似乎都运行得很好,但我使用RubyMine进行开发,并抱怨在类定义中使用变量而不是常量。它提出了这是否是一个好主意的问题。
那么,这种方法可以吗?是否有一些我没有看到的陷阱?这种方法还有其他选择吗?
答案 0 :(得分:1)
这是完全可以的 - 只要变量在运行此代码时包含一个Class实例(这会产生TypeError:“superclass必须是Class”)。
当你有一个非常量的命名类/模块时,Ruby只会给出这个错误,例如:
class c; end
module m; end
而不是
class C; end
module M; end
所以要么你在其他地方遇到这个问题(如果一切正常,因为这是一个错误而不是警告),或者RubyMine由于某种原因错误地给你错误。 Ruby没有给出你所拥有的警告。
答案 1 :(得分:0)
正如Andrew所指出的,这在Ruby中很好,并且警告是RubyMine的问题。解决警告仍然获得相同ruby语义的一种可能方法是使用Class::new
而不是class
关键字来定义您的类:
MyEngine::ApplicationController = Class.new(MyEngine.authenticated_controller) do
#some code
end