2012-05-03 15 views
4

私はモジュールを含むモデルを持っています。モジュール内のモデルのアクセサメソッドをオーバーライドしたいと思います。例えばmixin/module内のモデルの属性アクセサをオーバーライドします

class Blah < ActiveRecord::Base 
    include GnarlyFeatures 
    # database field: name 
end 

module GnarlyFeatures 
    def name=(value) 
    write_attribute :name, "Your New Name" 
    end 
end 

これは明らかに動作しません。これを達成するための任意のアイデア?

答えて

7

コードが正しいように見えます。この正確なパターンは問題なく使用しています。

私が正しく覚えていれば、Railsは属性設定ツールに#method_missingを使用するので、モジュールが優先されActiveRecordのセッターがブロックされます。あなたがactivesupportのを使用している場合::懸念(そして、あなたのインスタンスメソッドは、特別なモジュールに移動する必要があり、this blog postを参照してください

:。。

class Blah < ActiveRecord::Base 
    include GnarlyFeatures 
    # database field: name 
end 

module GnarlyFeatures 
    extend ActiveSupport::Concern 

    included do 
    def name=(value) 
     write_attribute :name, value 
    end 
    end 
end 
+0

うーむ、私はあなたがActiveSuppportを拡張する場合についてはどのように間違った何かをしなければなりません。 :モジュールの一部としての心配? – KendallB

+0

私の更新された答えを参照してください – tihm

+0

恐ろしいですが、それは助かりましたが、正確ではありませんでした.Rails 3.2では、InstanceMethodsは含まれなくなりました。アクセサーを含むブロックにアクセサーを含める – KendallB

関連する問題