2017-06-02 13 views
0

私は@foo.updateを呼び出し、更新中の属性の中にfooのモデルクラスの書き込みメソッド(def attribute=)を呼び出して、条件付きで更新全体を失敗させたい。私はそこに何を入れることができますか?私はerrors[:base]を使ってみましたが、saveは失敗しません。 validatesを使用することはできません。属性が保存される前に別のものに変換されるからです。手作業で#update_attributesをRailsに保存する

def attribute=(attr) 
    if bar 
     # code to fail entire db save 
    end 
    end 
+0

どのようにエラー[:base]を使用しようとしましたか? –

+0

エラーを発生させて、オプションを保存して外に出ようとしていますか? –

+0

@ruby_newbie上記の 'if bar'条件の中に' errors [:base] << "failed"で配置しました。 – stackjlei

答えて

1

あなただけのモデルfoo.rbbefore_saveコールバックに条件を確認し、それを保存したくない場合はfalseを返すことができます。

before_save :really_want_to_save? 

private 

def really_want_to_save? 
    conditional_says_yes ? true : false 
end 

あなたも、エラー・メッセージが必要な場合は、セッターの中から中止したい場合は、

def really_want_to_save? 
    if conditional_says_yes 
    true 
    else 
    errors[:base] << "failed" 
    false 
    end 
end 
+0

'before_save'とvalidateの違いは何ですか?誰かが先に来るのだろうか? 'before_save'はセッターメソッドの前に来ますか? – stackjlei

+0

'before_save'が' validations'の前に実行され、モデルの検証や保存の前にいくつかの属性を操作したいという考えがあります。 –

+0

ここでfalseを返すと保存全体がキャンセルされますか? – stackjlei

0

、その後、例外を発生させることは十分です。

def attribute=(attr) 
    if bar 
     raise "Couldn't save because blah blah" 
    end 
    end 

ただし、他の投稿に記載されているように、保存する前にこのチェックを行う方がよいでしょう。それが検証の目的です。

validate :my_condition 

def my_condition 
    if bar 
    errors.add(:base, "Couldn't save because blah blah") 
    end 
end 
+0

は全体の保存をキャンセルするエラーを起こすでしょうか? – stackjlei

+0

@stackjlei:それは私が言ったことです、いいえ? –

+0

私はそれが黙って失敗したらどうしますか? – stackjlei

関連する問題