从变量而不是常量继承

时间:2013-06-30 21:53:39

标签: ruby-on-rails ruby

我目前正在编写一个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进行开发,并抱怨在类定义中使用变量而不是常量。它提出了这是否是一个好主意的问题。

那么,这种方法可以吗?是否有一些我没有看到的陷阱?这种方法还有其他选择吗?

2 个答案:

答案 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