これは、スコープが原因で発生します。メソッド内にいて、次のような新しい変数を設定しようとした場合:
class SomeData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
end
end
set_active_flag内に存在する新しい変数を作成しています。実行が完了するとすぐに消え、self.active_flag
(実際のインスタンス変数)は変更されません。
ただし(これは私にとって混乱の原因でした):次のように、rubyでインスタンス変数を読み取ろうとすると:
class SomeData < ActiveRecord::Base
def whats_my_active_flag
puts active_flag
end
end
実際にself.active_flag
(実際のインスタンス変数)が返されます。
理由は次のとおりです。
Rubyは、戻りを回避するためにできることを実行しますnil
。
- 最初に「
active_flag
の範囲内に存在しますwhats_my_active_flag
か? 」と尋ねます。
- 検索して答えが「いいえ」であることに気付くと、SomeDataのインスタンスに1レベル上にジャンプします。
- それは再び同じことを尋ねます:「
active_flag
この範囲内に存在しますか?
- 答えは「うん」なので、「私はあなたのために何かを手に入れました」と表示され、それが返されます!
ただし、active_flag
内で定義しwhats_my_active_flag
、それを要求すると、次の手順が再度実行されます。
- 「
active_flag
の範囲内に存在しますwhats_my_active_flag
か?
- 答えは「うん」なので、その値を返します
いずれの場合も、明示的に指示しない限り、の値は変更されません。self.active_flag
この振る舞いを説明する簡単な方法は、「あなたを失望させたくない」というnil
ことです。そのため、できる限りのことを見つけるのが最善です。
同時に、「変更するつもりのないデータを台無しにしたくない」ので、インスタンス変数自体を変更しません。
お役に立てれば!