簡體   English   中英

驗證的條件allow_nil部分

[英]Conditional allow_nil part of validation

在編寫浮動屬性驗證時,我偶然發現了一個我總是想驗證數字的情況,但在某些情況下只允許allow_nil。

現在,我的解決方案通常是allow_nil,然后編寫一個單獨的狀態驗證。

validates :price, numericality: { greater_than: 0 }, allow_nil: true
validates :price, presence: true,
  if: Proc.new { |v| v.voting.fan_priced? }

這可行,但看起來並不干凈。 理想情況下,我想要這樣的東西(一種偽代碼):

validates :price, numericality: { greater_than: 0 },
  allow_nil: Proc.new { |v| v.voting.fan_priced? ? false : true }

但這顯然不起作用。

有什么辦法可以更有效地做到這一點? 在SO上也發現了這一點 ,但這看起來很相似,實質上是對同一事物使用了兩個單獨的驗證。

PS:不知何故,我驗證過程中的程序弄亂了我的比喻匹配器。 簡單的東西,例如

it { should_not allow_value(0).for(:user_id) }

現在以相同的模式給我

undefined method `fan_priced?' for nil:NilClass

比賽匹配者不能在proc中處理關聯嗎?

我想我發現了一種使用新的缺勤驗證器更好地工作的方法:

validates :price, numericality: { greater_than: 0 }, if: 'voting.fan_priced?'
validates :price, absence: true, unless: 'voting.fan_priced?'

這樣,我仍然有兩個價格驗證,但是通過相反的if和not聲明它們針對相同的上下文更加明顯。

如果有人想使用缺失驗證器,那么它僅在rails 4中可用。但是,如果在rails 3項目中需要它,則只需創建lib / validators / absence_validator.rb並從rails回購中添加此代碼 然后,使用以下代碼創建config / initializers / core_extensions.rb,以使該自定義驗證器可在每個模型中使用(否則您可能會遇到規格方面的問題)

# Make custom validators available in each model
module ActiveModel::Validations
  Dir[Rails.root.join("lib/validators/**/*.rb")].each {|f| require f}
end

也許它可以幫助某人!

PS:哦,我通過這樣做解決了奇怪的shoulda匹配器錯誤

if: Proc.new { |v| v.voting.present? and v.voting.fan_priced? }

以該順序。

也許您可以使用自定義驗證器:

validates :price, numericality: { greater_than: 0 }, allow_nil: true
validate :price_presence

def price_presence
  errors.add(:price,'Price cannot be blank.') if self.voting.fan_priced? and self.price.blank?
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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