ActiveRecord中的条件验证问题

时间:2013-04-22 08:33:04

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

我必须有条件地验证我的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

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

这个问题有另一个解决方案吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

怎么样

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