1

我目前正在编写一个 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. 我用这篇博文来寻找灵感。

一切似乎都很好,但我正在使用 RubyMine 进行开发,它抱怨在类定义中使用变量而不是常量。它提出了这是否是一个好主意的问题。

那么,这种方法好吗?是否有一些我没有看到的问题?这种方法有什么替代方法吗?

4

2 回答 2

1

这完全没问题——只要在代码运行时变量包含一个 Class 实例(这会给出一个 TypeError:“superclass must be a Class”)。

当你有一个非常量的命名类/模块时,Ruby 只会给出这个错误,例如:

class c; end
module m; end

class C; end
module M; end

因此,要么您在其他地方遇到此问题(如果一切正常,因为这是一个错误,而不是警告),或者 RubyMine 出于某种原因错误地给您错误。Ruby 不会对你所拥有的东西发出警告。

于 2013-06-30T23:11:14.663 回答
0

正如 Andrew 指出的那样,这在 Ruby 中很好,警告是 RubyMine 的问题。解决警告并仍然获得相同 ruby​​ 语义的一种可能方法是使用Class::new而不是class关键字来定义您的类:

MyEngine::ApplicationController = Class.new(MyEngine.authenticated_controller) do
  #some code
end
于 2013-07-01T00:33:21.047 回答