2012-04-12 2 views
11

私のアプリケーション全体を通して、self.はユーザーの名前を参照する必要はありません。 nameは問題なく動作します。なぜ "self"を使ってActiveRecord/Railsモデルのプロパティにアクセスするのですか?

なぜ次のコードではselfが意図したとおりに動作する必要がありますか?ところで

class User< ActiveRecord::Base 
    before_save :validate_name 

def validate_name 
    if self.name.nil? || self.name.empty? 
     self.name= "Mr. No Name" 
    end 
end 

、私はvalidates_presence_of保存を防止するために用いることができることを知っているが、私は名前が指定されていない場合、デフォルトで保存します。

Rails 3.0.7。

答えて

23

多くの場合、selfを使用すると、Rubyにメソッド呼び出しとして認識させ、変数として誤って解釈されないようにすることがよくあります。 day=というメソッドの事前の知識がなければ、day = "x"はRubyを変数のように扱います。 self.day = "x"は常にメソッド呼び出しです。

これは、ユーザークラスファイルが解析された後にnamename=のメソッドが動的に追加されるためです。モデルを使用する際にRailsが最初に行うことは、関連するデータベースフィールドのメソッドを作成することですが、これはファイルが解析された後に発生します(user.rb)。

+0

申し訳ありませんが、 'self.day'は' self.name'になっていました!私は質問を更新しました。 –

+6

Nit:Rubyは 'x = y'をメソッド呼び出しに使用しません。これは常に直接変数(または場合によっては定数)の代入です。 'x'(式として)という形式は、(変数として)そのような' x 'があるかどうかによって決まります。 –

+0

クラスファイルが解析された後に 'name'と' name = 'が動的に追加された場合、' name'は 'self.name'を意味し、' name'はローカル変数です。 –

関連する問題