2009-09-30 12 views
16

ActiveRecordには、モデルロジックを単純化するために使用されるいくつかの異なるコールバックメソッドがあります。例えば、after_findおよびbefore_createの方法。ActiveRecordコールバックで、インスタンス変数またはインスタンスメソッドの先頭にselfキーワードが必要なのはなぜですか?

このコードの例を考えてみましょう:

class ExternalPrintingCard < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :ph_user 

    after_create :change_pin 

    def change_pin 
    self.user.randomize_printer_pin 
    end 

    def after_find 
    return if self.card_status == false 
    self.card_status = false if self.is_used_up? 
    self.card_status = false if self.is_expired? 
    self.save! 
    end 
end 

私はインスタンス変数やインスタンスメソッドからのすべてのselfプレフィックスを削除すると、これら2つのコールバックが呼び出されますが、彼らはこれらのコールバック内のローカル変数であるかのようにそれがありますメソッド。

このインスタンス変数(card_status)、インスタンスメソッド(save!is_used_up?is_expired?)と会合(user)はself接頭することなく、これらの2のコールバックメソッドの外にうまく働きました。

コールバックメソッド(インスタンスメソッド)のためのRailsのドキュメントのサンプルコードは、selfプレフィックスが通常はなくアクセス可能なインスタンス変数またはメソッドを呼び出していても、常にself接頭辞を使用しているようです。

ActiveRecordコールバックをよく理解している人が、この動作を明らかにしてくれることを願っています。

乾杯

答えて

14

技術的には、割り当て方法の前で自己を使用する必要があります。 これは、末尾に=を付けたインスタンスメソッドとローカル変数への代入を区別するために必要です。

+5

多くの詳細については、Thoughtbotの記事を参照してください。http://robots.thoughtbot.com/post/185504560/to-self-or-not-to-self –

+0

http://www.rubyfleebieを説明する別の記事。 com/use-self-explicit / –

1

ナスモーンが正しいです。

ActiveRecord :: Baseは、@attributesインスタンス変数(Hash)内のすべての列名を配置し、これらの列名のアクセサメソッドインスタンスメソッドを作成します。例えば

:card_statusはexternal_printing_cards表の列である

ルビローカル変数の定義は動的であるので、名前card_statuscard_status=

とアクセサメソッドを持つことになり、ライン

def after_find 
    .... 
    card_status = false if self.is_used_up? 
    .... 
end 

は、インスタンスメソッドではなくローカル変数card_statusを定義して割り当てることを意味します。card_status=

Peer Allanが投稿した記事は、これに関する詳しい説明を提供しています。

関連する問題