1

特定のステータスが与えられた場合、そのステータスは二度と変更できないモデルがあります。モデルに before_save を入れてステータスを確認し、特定のステータスに設定されている場合は例外を発生させることで、これを達成しようとしました。

問題はこれです -

 def raise_if_exported
   if self.exported?
     raise Exception, "Can't change an exported invoice's status"
   end
 end  

これは正常に動作しますが、最初に次のようにしてステータスをエクスポートに設定したとき-

 invoice.status = "Exported"
 invoice.save

ステータスがすでにdbではなくモデルにエクスポートされているため、例外が発生します(私は思う)

「エクスポート済み」に設定された属性が変更されないようにする方法はありますか?

4

4 に答える 4

3

要件にバリデーターを使用できます

class Invoice < ActiveRecord::Base

  validates_each :status do |record, attr, value|
     if ( attr == :status and status_changed? and status_was == "Exported")
       record.errors.add(:status, "you can't touch this")
     end
  end

end

invoice.status= "Exported"
invoice.save # success

invoice.status= "New"
invoice.save # error
于 2012-07-12T00:38:22.630 に答える
1

ActiveModel::Dirty現在のステータスを確認する代わりに、変更を追跡するために使用することもできます。

def raise_if_exported
  if status_changed? && status_was == "Exported"
    raise "Can't change an exported invoice's status"
  end
end

保存時にその例外を本当に発生させたい場合にのみ、これを試してください。そうでない場合は、@Trip が提案するように検証中に確認してください

詳しくはこちらのページをご覧ください。

于 2012-07-12T00:34:31.640 に答える
1

@Trip と @Sikachu の回答を組み合わせて使用​​します。

validate :check_if_exported

def check_if_exported
  if status_changed? && status_was.eql?("Exported")
    errors.add(:status, " cannot be changed once exported.")
  end
end

モデルを無効にすることは、本当にやりたい場合を除き、単にエラーをスローするよりも優れた応答です

于 2012-07-12T00:59:19.257 に答える
0

モデルで Rails 組み込みの検証を試してください。

validate :check_if_exported

def check_if_exported
  if self.exported?
    errors.add(:exported_failure, "This has been exported already.")
  end
end
于 2012-07-12T00:32:09.810 に答える