2

属性(文字列)と属性(ブール値)を持つMessageモデルがあります。メッセージは、送信されるまで変更可能である必要があり、その後、そのフィールドは読み取り専用になる必要があります。( などの他の属性は変更可能です)。contentsentcontentmessage_opened

どうすればこれを達成できますか? オーバーライドreadonly?(レコード レベルでのみ適用される)、 (条件付きではない)、および検証 (古い値とフィールドの両方に依存するattr_readonly検証を行う方法がわからない) について調べました。contentsent

4

2 に答える 2

3

検証が正しいアプローチであることが判明しました: attribute_changed?(「attribute」は属性の名前で、この場合は「content」) と条件付き検証を使用するカスタム検証を作成します。

メッセージ.rb:

validate_on_update :reject_modifying_content, if: :sent?

def reject_modifying_content
 errors[:content] << "can not be changed!" if self.content_changed?
end

詳細については、 Rails 3 check if attribute changedRails でフィールドを作成後に読み取り専用に設定する、およびhttp://api.rubyonrails.org/classes/ActiveModel/Dirty.htmlを参照してください。

于 2013-05-01T11:39:07.663 に答える
0

考えられる答えを調べて、フィールドを次のように設定すると思います:

attr_readonly

最適なオプションは、カスタム コードを必要とせずにそのフィールドを完全に保護することです。

読み取り専用としてリストされている属性は、新しいレコードの作成に使用されますが、更新操作ではこれらのフィールドは無視されます。

于 2015-09-13T05:13:52.697 に答える