2009-10-05 12 views
5

いくつかのモデルを含むエンジンスタイルのプラグインにいくつかのコードがあります。私のアプリでは、これらのモデルの1つを拡張したいと考えています。私は、イニシャライザ内からモジュールを組み込むことによって、問題のモデルにインスタンスメソッドとクラスメソッドの両方を追加することができました。モジュールを使用して "has_many"プラグインでモデルを拡張します

しかし、アソシエーション、コールバックなどを追加できないようです。「メソッドが見つかりません」というエラーが表示されます。私はこれが

module Qwerty 
    module Core 
    module Extensions 
     module User 
     # Instance Methods Go Here 

     # Class Methods 
     module ClassMethods 
      def relate 
      has_many :hits, :uniq => true # no method found 

      before_validation_on_create :generate_code # no method found 
      end 

      def something # works! 
      "something" 
      end 
     end 

     def self.included(base) 
      base.extend(ClassMethods).relate 
     end 
     end 
    end 
    end 
end 

を動作するはずです古いコードが間違っている原因であると考え

/libs/qwerty/core.rb

module Qwerty 
    module Core 
    module Extensions 

     module User 
     # Instance Methods Go Here 

     # Class Methods 
     module ClassMethods 
      has_many :hits, :uniq => true # no method found 

      before_validation_on_create :generate_code # no method found 

      def something # works! 
      "something" 
      end 
     end 

     def self.included(base) 
      base.extend(ClassMethods) 
     end 
     end 
    end 
    end 
end 

/initializers/qwerty.rb

require 'qwerty/core/user' 

User.send :include, Qwerty::Core::Extensions::User 

答えて

6

検証と関連付けはモジュールロード時に呼び出され、このモジュールはActiveRecordについて何も知らない。これはRubyの一般的な側面です。クラス本体またはモジュール本体内のコードは、ロード時に直接呼び出されます。あなたはそれを望んでいません。この問題を回避するには、上記のソリューションを使用することができます。

+0

Gotcha:「リロードしています!コンソールではクラスがリロードされますが、私の場合はモジュールがイニシャライザから呼び出されるため、モジュールは再適用されません。 – Kris

+0

さらに、現時点では、コンソールの使用時にモジュール内のコードが表示されるだけで、コントローラから同じコードが呼び出されたときにエラーが発生します。私はコード例を掲載したいと思いますが、答えは正しくないようです(これは結局フォーラムではありません)。 – Kris

+0

CONTROLLER:render:text => User.new.respond_to?( 'ヒット' => false CONSOLE:User.new.respond_to?( 'ヒット')#=> true PREEMPT:サーバーをリブートしました:) – Kris

14

これを行う必要があります。もう少し簡潔なIMHO。 Railsの3で

module Qwerty::Core::Extensions::User 
    def self.included(base) 
    base.class_eval do 
     has_many :hits, :uniq => true 
     before_validation_on_create :generate_code 
    end 
    end 
end 
+0

これはまったく正しい答えです。 – kikito

4

、これはactivesupportの::懸念のために良いユースケースのように聞こえる:ここ

module Qwerty::Core::Extensions::User 

    extend ActiveSupport::Concern 

    included do 
    has_many :hits, :uniq => true 
    before_validation_on_create :generate_code 
    end 
end 

class User 
    include Querty::Core::Extensions::User 
    # ... 
end 

は、私が見つけたその上にActiveSupport::Concern docsと最も有用blog articleです。

関連する問題