値が存在しなくても、属性に値を割り当てるカスタムアクセサメソッドを持っています。my_attr属性は、空白値が指定されていない限り、指定された値とマージされるべきシリアル化されたハッシュですが指定されている場合は、現在の値を空白の値に設定します。 (そこに彼らがどうあるべきかの値であることを確認するチェックを追加されますが、簡潔にするため削除され、彼らは私の質問の一部ではないとして。)私のセッターは、次のように定義されます。このコードのようにうまく機能Railsモデルでselfの値は何ですか?また、明白なインスタンスメソッドが利用できない理由は何ですか?
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
-isですが、self.write_attribute()を使用した場合は表示されません。私は、次のエラーを取得する:
NoMethodError:
private method `write_attribute' called for #<MyModel:0x00000004f10528>
は、私の質問は、このようにしている:インスタンスに利用できるwrite_attributeを持っているより論理的と思われるので、なぜそれがクラスにのみ使用可能で、インスタンスにない? RubyやRails(またはその両方)の自己の私の基本的な知識に欠けているものはありますか?