我的代码可以更新/修复我的before_validation
回调中的某些模型数据。
但是,我希望能够仍然运行验证以查看模型是否正常。
更具体地说,我想知道数据库中的记录是否有效。因此,我希望能够加载一个值,并在不运行会影响答案的回调的情况下询问.valid?
。
所以,我试过这个(以及一些变化),但它没有工作:
skip_callback :validation, :before, unless: ->{self.changed?}
skip_callback
的文档很差,所以我不确定我是否正确使用它。这可以起作用吗?
感谢。
答案 0 :(得分:2)
根据example 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
答案 1 :(得分:1)
您可以跳过任何回调。您必须跳过回调并执行事务,然后再次设置回叫。
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)
类似地,您可以跳过here
中的所有回调答案 2 :(得分:0)
..我希望能够..问.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?