【问题标题】:Problems with conditional validation in ActiveRecordActiveRecord 中的条件验证问题
【发布时间】:2013-04-22 08:33:04
【问题描述】:

我必须有条件地验证我的User。用户注册后,他可以完成其余的个人资料。它分为几部分,例如,有“教育背景”和“专业背景”。这些部分由我必须验证的字段组成(例如存在)。

因此,当然,这些字段不应在注册期间进行验证,而应仅在用户尝试编辑这些字段时进行验证。一个自然的想法是在表单中发送context 参数,然后执行以下操作:

class User < ActiveRecord::Base
  attr_accessor :context

  with_options if: -> { |u| u.context == "educational" } do |s|
    s.validates :university_name, presence: true
    # ...
  end
end

但是如果我还需要在块内进行条件验证呢:

class User < ActiveRecord::Base
  attr_accessor :context

  with_options if: -> { |u| u.context == "educational" } do |s|
    s.validates :university_name, presence: true, if: :finished_university?
    # ...
  end
end

这意味着:ifs 的那些人会发生冲突。我可以将块中的每个:if 转换为:unless,但这会损害可读性,我真的不希望这样。

这个问题还有其他解决方案吗?

【问题讨论】:

标签: ruby-on-rails ruby validation rails-activerecord


【解决方案1】:

如果您需要这么多“if”语句,那么您的模型可能存在缺陷。也许你需要从你的用户中提取一个新模型,定义新的资源和控制器。

编辑: 这颗宝石可能会有所帮助: https://github.com/stevehodgkiss/validation-scopes

【讨论】:

  • 我同意,该模型的字段太多。但是我需要以某种方式解决它,因为我在它已经这样的时候就来了,拆分它需要太多时间。
  • 也许这个 gem 会有用:github.com/stevehodgkiss/validation-scopes
  • 是的!就是这样!更新您的答案,以便我批准它:)
【解决方案2】:

怎么样

validates :university_name, presence: true, if: :finished_university? &amp;&amp; lambda {|u| u.context == "educational"}

【讨论】:

  • 你的意思是if: -&gt; { |u| u.finished_university? &amp;&amp; u.context == "educational" }?是的,我真的很想避免将这个u.context == "educational" 放在每个字段中,因为这些字段真的很多,所以它真的会影响可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2018-07-05
  • 2010-10-14
  • 2022-10-06
相关资源
最近更新 更多