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