[英]How can I skip before_validations in Rails?
我有更新/修復我before_validation
回調中的一些模型數據的代碼。
但是,我希望仍然能夠運行驗證以查看模型是否正常。
更具體地說,我想知道數據庫中的記錄是否有效。 所以我希望能夠加載一個值並詢問.valid?
沒有運行我的回調會影響答案。
所以,我嘗試了這個(以及一些變體)但它沒有用:
skip_callback :validation, :before, unless: ->{self.changed?}
skip_callback
的文檔很差,所以我不確定我是否正確使用它。 這可以工作嗎?
謝謝。
根據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
您可以跳過任何回調。 您必須跳過回調並執行事務並再次設置回調。 Model.skip_callback(:callback_name, :callback_position, :callback_action_name)
例如。
class ModelName < ApplicationRecord
before_validation :validation_action
def validation_action
end
end
在調用 ModelName 時跳過此驗證
ModelName.skip_validation(:validation, :before, :validation_action)
ModelName.create!()
ModelName.set_validation(:validation, :before, :validation_action)
同樣,您可以從這里跳過所有回調
.. 我希望能夠 .. 問 .valid? 沒有運行我的回調會影響答案。
使驗證以attr_accessor
條件。
# banana.rb
attr_accessor :use_validation_callbacks
before_validation :derp, if: { |b| b.use_validation_callbacks }
def initialize(*)
self.use_validation_callbacks = true
super
end
# elsewhere
banana = Banana.new
banana.use_validation_callbacks = false
banana.valid?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.