2017-02-02 4 views
2

私はbefore_validationコールバックにいくつかのモデルデータを更新/修正するコードを持っています。Railsでbefore_validationsをスキップするにはどうすればよいですか?

しかし、まだモデルがそのままの状態であるかどうかを確認するために検証を実行できるようにしたいと考えています。

具体的には、データベースのレコードが有効かどうかを知りたいと思います。だから、私は値をロードし、回答に影響するコールバックを実行させずに.valid?に質問したいと思っています。

だから、私はこの(といくつかのバリエーションを)しようとしたが、それはうまくいきませんでした:

skip_callback :validation, :before, unless: ->{self.changed?}

skip_callbackためのドキュメントが悪いので、私は、私はそれを適切に使用しているかわかりません。これを働かせることができますか?

ありがとうございました。

+1

例ここhttp://apidock.com/rails/ActiveSupport/Callbacks/ClassMethods/skip_callback '言う:validate'ない':validation'、それは問題になるだろうか? – Iceman

+0

@Iceman it's ':validation'です。この 'Model._validation_callbacks'を使ってすべての' validation'コールバックを見つけることができます。 –

答えて

1

APIDockによると、skip_callbackはcallback_name、その後は*filter_listsが引数(ブロック)になります。

filter_listには、コールバックメソッド名を含める必要があります。以下のように

class User < ActiveRecord::Base 
    validates_presence_of :name 
    before_validation :set_name 

    skip_callback :validation, :before, :set_name, unless: -> { self.changed? } 

    def set_name 
    self.name ||= 'foobar' 
    end 
end 

#<User:0x007ffcd7165248 id: 2, name: nil, created_at: Fri, 03 Feb 2017 01:10:37 UTC +00:00, updated_at: Fri, 03 Feb 2017 01:10:37 UTC +00:00> 

User.find(2).valid? # returns false 

user = User.find(2) 
user.updated_at = Time.now 
user.valid? # returns true, because it invokes :set_name before validation 
+0

右のように、before_validationsやlambdaを使って実装されている名前のないものを避ける方法はないようです。ありがとう。 – z5h

+0

@ z5hあなたはそれらのすべてを単にリストすることができます –

関連する問題