2013-06-30 57 views
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的方法。我使用this blog post作爲靈感。

這一切似乎工作得很好,但我使用RubyMine進行開發,它抱怨在類定義中使用變量而不是常量。它提出了這是否是一個好主意的問題。

那麼,這種方法好嗎?我有沒有看到一些陷阱?這種方法有什麼替代方法嗎?

+1

SEMS沒什麼問題。 RubyMine沒有考慮到您的項目是Rails引擎的事實。因此,預計會有虛假的警告。 – PinnyM

+0

警告比這更一般。即使在Rails應用程序的上下文之外,我也看到了錯誤。確切的RubyMine錯誤是'類/模塊名稱必須是CONSTANT'。 –

+0

但是,感謝您的再次肯定,這是好的。 –

回答

1

這完全沒問題 - 只要該代碼運行時這個變量包含一個Class實例(這會導致TypeError:「超類必須是Class」)。

紅寶石只給出了當你有一個非恆定命名的類/模塊,例如此錯誤:

class c; end 
module m; end 

,而不是

class C; end 
module M; end 

因此,無論你在其他地方有這個問題(可能性不大,如果一切正常,因爲這是一個錯誤,而不是警告),或者RubyMine由於某種原因錯誤地給你錯誤。 Ruby沒有提供任何警告。

+0

謝謝!看起來我應該爲RubyMine提交錯誤報告。 –

0

Andrew指出這在Ruby中很好,警告是RubyMine的一個問題。一種可能的方法來變通的警告,仍然得到同樣的紅寶石的語義是使用Class::new代替class關鍵字來定義你的類:

MyEngine::ApplicationController = Class.new(MyEngine.authenticated_controller) do 
    #some code 
end