【问题标题】:Rails validation not failingRails 验证没有失败
【发布时间】:2015-01-12 10:17:04
【问题描述】:

我对模型字段进行了以下验证:

validates :invoice_date, :presence => true, :unless => Proc.new { |invoice| invoice.invoice_date.future? }

它看起来很简单,但它不起作用。如果日期在未来,则不会引发错误。在这种情况下,Proc 确实会返回 false

知道为什么没有显示任何验证错误吗?

【问题讨论】:

  • 你希望这个日期在将来时抛出错误?
  • 是的,这是预期的行为。
  • 您还应该评论拒绝投票的原因。
  • @ShamsulHaque downvote 是我的,这是因为您的第一个答案版本根本没有解决 OP 的问题。
  • @MarekLipka 如果它不起作用,那么您可以通知它不起作用,之后我可以更改它以满足您的要求。否则你可以投反对票。

标签: ruby-on-rails validation proc


【解决方案1】:

“除非”条件用于决定验证是否应该运行,而不是它是否应该成功或失败。所以你的验证本质上是说“验证 invoice_date 的存在,除非 invoice_date 在未来,在这种情况下不验证它的存在”(这没有意义)

听起来你想要两个验证,存在和日期围栏。

validate :invoice_date_in_past

def invoice_date_in_past
  if invoice_date.future?
    errors.add(:invoice_date, 'must be a date in the past')
  end
end

【讨论】:

  • 哦,文档对此不够清楚(至少对我而言)。感谢您的澄清和修复。
【解决方案2】:
validates :invoice_date, :presence => true
validate :is_future_invoice_date?

private
 def is_future_invoice_date?
   if invoice_date.future?
     errors.add(:invoice_date, 'Sorry, your invoice date is in future time.')
   end
end

Presence true 只是确保 invoice_date 必须存在。 为了验证日期是否为未来日期,我们指定了自定义验证方法。(is_future_invoice_date?) 如果日期是未来日期,此方法将针对我们的 invoice_date 属性添加错误消息。

更多信息在这里:http://guides.rubyonrails.org/active_record_validations.html#custom-methods

【讨论】:

  • 我认为您可以详细说明您的答案。代码很有用,但没有任何解释。
【解决方案3】:

试试这样:--

validate check_invoice_date_is_future

def check_invoice_date_is_future
 if invoice_date.present?
   errors.add(:invoice_date, "Should not be in future.") if invoice_date.future?
 else
   errors.add(:invoice_date, "can't be blank.")
 end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多