1

ApplicationController私は現在、Rails エンジンを作成しており、エンジンの構成で指定されたコントローラーから派生させたいと考えていました。

たとえば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 に答える