Rails 3.1.6アプリに、値が存在しない場合でも属性に値を割り当てるカスタムアクセサーメソッドがあります.my_attr属性はシリアル化されたハッシュであり、空白の値が指定されていない限り、指定された値とマージする必要があります、この場合、現在の値は空白の値に設定されます。(値が正しいことを確認するためのチェックが追加されていますが、質問の一部ではないため、簡潔にするために削除されています。)私のセッターは次のように定義されています。
def my_attr=(new_val)
cur_val = read_attribute(:my_attr) #store current value
#make sure we are working with a hash, and reset value if a blank value is given
write_attribute(:my_attr, {}) if (new_val.nil? || new_val.blank? || cur_val.blank?)
#merge value with new
if cur_val.blank?
write_attribute(:my_attr, new_val)
else
write_attribute(:my_attr,cur_val.deep_merge(new_val))
end
read_attribute(:my_attr)
end
このコードはそのままでうまく機能しますが、self.write_attribute()を使用する場合は機能しません。次に、次のエラーが発生します。
NoMethodError:
private method `write_attribute' called for #<MyModel:0x00000004f10528>
したがって、私の質問は次のとおりです。インスタンスでwrite_attributeを使用できるようにする方が論理的であるように思われるのに、インスタンスではなくクラスでのみ使用できるのはなぜですか。RubyまたはRails(またはその両方)での自己の基本的な知識に欠けているものはありますか?