3

一度設定した属性を ActiveRecord モデルで変更できない機能を実装しようとしています。この目的のために、次のメソッドを作成しました。

def address
 self[:address]
end

def address=(val)
 if new_record?
  self[:address] = val
 else
  errors.add(:address, "Cannot change address, once it is set")
  return false # tried return nil here first, did not work
 end
end

ここで何か間違ったことをしていますか?アドレスを変更しようとすると、オブジェクトを無効にしたいのですが、変更してもエラーは発生しません。obj.valid?

編集:値は一度設定されると変更されませんが、obj.valid を介して検証を行うときに無効なオブジェクトを取得したいですか?

4

1 に答える 1

8

するとobj.valid?、すべてのエラーがクリアされ、各検証が順番に実行されます。これで検証時にエラーが発生するようにするには、そのロジックを検証ブロックに移動する必要があります。

インスタンス変数を使用してこれを行う 1 つの方法の例を次に示します。

def address=(val)
  if new_record?
    self[:address] = val
  else
    @addr_change = true
    return false # tried return nil here first, did not work
  end
end

validate do |user|
  errors.add(:address, "Cannot change address, once it is set") if @addr_change
end
于 2011-03-01T20:00:56.177 に答える