【问题标题】:Rails nested with_option :if used in validationRails 嵌套 with_option :if 用于验证
【发布时间】:2012-11-01 09:46:00
【问题描述】:
validate :updatable?  # First validation there is
with_options :if => Proc.new { |object| object.errors.empty? } do |updatable|
    updatable.with_options :if => "self.current_step == basic" do |step|
        validates .... bla-bla bla

因此,在进行任何验证之前,将调用 可更新 子例程,并用适当的错误填充 errors[:base] 数组,这意味着该对象不可更新。如果在此子例程中发现任何错误,我希望它跳过其余的验证,但上述示例工作 - 它执行所有验证。

但是,如果我将 :if => "self.current_step == basic" 更改为 :if => "self.errors.empty? && self.current_step == basic" 就像一个魅力。

我做错了什么?示例显示,嵌套的 with_option 应该可以工作。

有人可以帮助我吗?提前致谢。

【问题讨论】:

  • 在我看来,这是一个错误,因为条件没有合并在一起,所以实际上只涉及最后一个。希望有人会关注这个,它会在以后的版本中得到修复。
  • 现在是 2021 年,Rails 6.0 仍然如此

标签: ruby-on-rails ruby validation nested


【解决方案1】:

你是对的,当嵌套两个 :if 条件时,内部的将替换外部的并且总是被检查。处理两级嵌套的解决方法是:

with_options :unless => !(outer condition) do
  with_options :if => (inner condition) do

if 和 unless 条件不会相互覆盖。我不确定我是否会将此称为错误,但如果您可以嵌套多个 :if 条件会很好。

【讨论】:

  • 我不知道这个。谢谢。
  • 似乎更多的是设计考虑来覆盖 if 语句。将多个条件放在最后一个 if 语句中会更整洁。
  • 这感觉不对。不过真的没有别的办法了吧?
  • @Yewness 我认为我完全不同意这一点。范围不是这样工作的,这应该几乎完全类似于嵌套验证器。
猜你喜欢
  • 2016-09-17
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多