それぞれ異なる検証を持つ合計 7 つのモデルを含むネストされたフォームを使用しています。フォームを単純に編集すると、検証が実行されて正常に表示され、データが適切に保存されます。ただし、フォームの送信者に応じて異なる検証を実行する必要があります (つまり、管理者は必須フィールドをスキップできます)。
モデルで attr_accessible :editing_user を使用して特定の検証をスキップできると考え、これをコントローラー内で設定しました。
class ModelExample < ActiveRecord::Base
attr_accessible :editing_user
validates_presence_of :email, :unless => "editing_user == 'admin'"
end
class ModelExamplesController < ActionController::Base
def create
@model_example = ModelExample.new(params[:model_example])
@model_example.editing_user = 'admin'
@model_example.save
end
end
ネストされたモデル内でこの基本構造を使用し、適切に保存できるかどうかを確認しました。ここから奇妙な行動が始まります。何らかの理由で、ActiveRecord がネストされたモデルを複数回保存しようとして、そのたびに検証を実行しているようです。これを奇妙にしているのは、@model_example.save を呼び出していることです。これは、失敗した場合に false を返すだけです。ただし、最初の検証は (editing_user が設定されているため) 通過しますが、その後の検証は失敗して例外が発生するため、通常の .save メソッドは戻る代わりに例外を発生させてしまいます。
ActiveRecord がすべての追加の検証と保存を行わないようにする方法、またはこれらの重複するアクション全体で edit_user を保持する方法を知っている人はいますか?