Rails 3で、空のレコードを作成し、検証せずにデータベースに保存して(空であるため)、ユーザーがこのレコードを編集できるようにする必要があるプロジェクトに取り組んでいます。それを完了し、それ以降検証するために。
今、私はかなり基本的な問題に遭遇しました:どのような状況でもモデルを検証せずにモデルを保存することはできないようです。
コンソールで次のことを試しました。
model = Model.new
model.save(false) # Returns RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
model.save( :validate => false ) # Returns same error as above
model = Model.create
model.save(false) # Same runtime error
model.save( :validate => false ) # Same runtime error
次に、モデル内のすべての検証を:on => :update
に変更してみました。保存しようとすると同じエラーメッセージが表示されます。
だから私はここで何が欠けていますか?空のレコードを作成し、ユーザーが編集したときに検証を実行するにはどうすればよいですか?
ありがとう!
*はぁ...*
問題が見つかりました... after_validateメソッド呼び出しの1つが情報の追加とモデルの再保存でした。したがって、取得したエラーはコンソール入力からではなく、再び保存されていたafter_validateメソッドから発生していました。
皆さんありがとう。
通常のユースケースで無効なモデルを保存することは悪い習慣です。代わりに条件付き検証を使用してください。
validates_presence_of :title, :unless => :in_first_stage?
またはあなたがたくさん持っている場合:
with_options :unless => :in_first_stage? do
validates_presence_of :title
validates_presence_of :author
end
このように、すべてのレコードの有効性をチェックする夜間の整合性テストを行うことを妨げるものは何もありません。
検証なしで保存するための有効なユースケースは、エッジケースをテストすることです。データベース制約が適用されていることをテストします。
これを非常に慎重に検討し、これが良い考えであると確信していると仮定すると、以下を使用して検証せずに保存できます。
my_model.save validate: false
これの有効な使用例はほとんどなく、緊急の1回限りの手順と見なす必要があります。あなたのユースケースは適格ではありません。
データベースに無効なレコードがあると、あらゆる種類の問題が発生します。たとえば、すべてのユーザーに電子メールを送信し、ユーザーモデルの「last_contacted_at」フィールドを更新するとします。無効なユーザーは更新されず、電子メールのスパイラル死に陥ります。
他の投稿者が指摘しているように、条件付き検証は、他の方法でvalidateを使用した可能性のあるほとんどの問題を解決します:false。
無効なモデルをデータベースに配置する代わりに、部分的に完成したモデル(Model.new
で作成) セッション内 を保存します。完全に有効な場合にのみデータベースに保存してください。