2012-03-30 11 views
0

私はレールの宝石を作成するのが面倒です。ActiveRecordにメソッドを追加するのに問題があります。のは、私は、次の操作を行いたいとしましょう:Rails:activerecordにメソッドを追加する(正しい方法ですか?)

class DemoModel < ActiveRecord::Base 
    custom_method :first_argument, :second_argument 
end 

、この作業を行うために、私は以下に投げる:

module DemoMethod 

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

    module ClassMethods  
    def custom_method(*fields) 
     @my_fields = fields 
    end 
    end 

end 

ActiveRecord::Base.send(:include, DemoMethod) 

ここまでは、とても良いです。

問題は、モデルのインスタンスからmy_fields変数にアクセスすることです。例えば、私のようなものとのform_for開くかもしれない:難易度がある

module ActionView::Helpers::FormHelper 
    def fields_for(record_name, record_object, options = {}, &block) 
    the_fields = record_object.<I WANNA ACCESS @my_fields HERE!!!>.html_safe 
    # ... 
    end 
end 

、(「custom_method」は唯一、私はクラスメソッドとしてヘルパーに設定した場合は動作するようですが、それは.self、今のモデルであることを意味しDemoModel)を使用しています。 "custom_method self、:first_argument、:second_argument"を使ってオブジェクトを手作業で渡すことができましたが、私のすばらしい "custom_method"宝石のユーザに引数のリストに 'self'を前に付ける必要があるのはちょっと不思議です。

それで、賢明なRailsの人がcustom_methodを通して特定のオブジェクトの値を設定し、fields_forのような別のものを取り出すのはどうでしょうか?

いつもどんな提案もありがとうございます。

答えて

2

self.includedおよびClassMethodsを使用すると、メソッドがクラスメソッドとして追加されます。

通常、モジュール内でメソッドを定義し、それらを含めることは、通常のインスタンスメソッドを作成する方法です。ように:

module DemoMethod 

    def custom_method(*fields) 
    @my_fields = fields 
    end 
end 

ActiveRecord::Base.send(:include, DemoMethod) 
+0

もちろんです。 。拡張は私を混乱させていた。どうもありがとう。 – PlankTon

関連する問題