簡體   English   中英

如何跳過 Rails 中的 before_validations?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM