2012-03-12 6 views
4

私はActiveRecordオブジェクトを持っています。モデルに永続的な検証を行わずに、保存しないようにしたいと思います。以前はerrors.addを使ってこのようなことをすることができましたが、それはもう動作しないように見えます。私はそれは、モデルの変更せずにRailsの3.2に救わからユーザーオブジェクトを防ぐことができますどのようにRails 3.2エラーを使用してオブジェクトを保存しないようにする

user = User.last 
user.errors.add :name, "name doesn't rhyme with orange" 
user.valid? # => true 
user.save # => true 

または

user = User.last 
user.errors.add :base, "my unique error" 
user.valid? # => true 
user.save # => true 

+0

"永続的"検証を使用できない理由は何ですか?あなたがしようとしていることをやっていると思っているのは、モデル外で検証ロジックを動かすことです。これは良い考えではありません。 –

+1

私はこの質問に多くの質問をしています。私はhttps://github.com/schneems/wickedを書いた宝石を手に入れました。オブジェクトが保存されている_every_ timeと呼ばれることのない1行のバリデーションを書いています。ウィザードのコンテキストこの情報をドキュメントに追加します。メタプログラミングによって、実行時までどのモデルを更新しているのかわからなくても可能です。エラーが追加されたときにARオブジェクトが保存されないようにする一般的な方法は、Railsの以前の動作と非常に役立ちます。なぜかにかかわらず、どのようにまだ立つのだろうかという疑問。 – Schneems

答えて

7

あなたは、errorsを設定しますが、validateメソッドの中でそれを行うことができ、例えば:あなたは条件付きで検証を実行したい場合は

validate :must_rhyme_with_orange 

def must_rhyme_with_orange 
    unless rhymes_with_orange? 
    errors.add(:name, "doesn't rhyme with orange") 
    end 
end 

、1つのトリックはattr_accessorを使用することで、ガード条件:

attr_accessor :needs_rhyming 

validate :must_rhyme_with_orange, :if => Proc.new {|o| o.needs_rhyming} 

> u = User.last 
> u.needs_rhyming = true 
> u.valid? # false 
2

問題は有効ですか?検証を再実行してエラーをリセットします。

 pry(main)> u.errors[:base] << "This is some custom error message" 
    => ["This is some custom error message"] 
    pry(main)> u.errors 
    => {:base=>["This is some custom error message"]} 
    pry(main)> u.valid? 
    => true 
    pry(main)> u.errors 
    => {} 
    pry(main)> 

代わりに、u.errors.blankを確認してください。

+0

これは、この特定の状況では機能しません。予想される機能を変更する必要はありません。ユーザーがオブジェクトを取得する前に保存できるため、エラーがクリアされます。しかし、応答に感謝します。また、こんにちは素晴らしいです...それを使用してうれしい:) – Schneems

+0

NP、あなたは単にあなたが欲しいものを行うことはできません。実際にモデルにバリデーションを追加することはありません。あなたはモデルクラスにミックスインを含めることでできます。 –

0

これは元の質問からわずかに逸脱していますが、私はこの記事をいくつか試してみました。 Railsには、_destroy属性がtrueとして割り当てられているオブジェクトの保存を拒否する機能が組み込まれています。コントローラレベルでモデル作成を処理している場合は非常に役に立ちます。

関連する問題