首页 > 解决方案 > 如何对关联对象动态提供的属性使用 Rails 验证

问题描述

我的User模型将 db 字段作为 field1 到 field10,其中一个是电子邮件字段。

我想像下面一样验证它,

validates :field1,
          format: { .. },
          if: Proc.new{ |i| i.active? }

但我的问题是,我不知道哪个是电子邮件字段,这取决于UserStructure具有 db 字段的对象,因为email_field它建议哪个是User表中的电子邮件字段

validates Proc.new{ |i| i.user_structure.email_field },
          format: { .. },
          if: Proc.new{ |i| i.active? }

但上面不起作用,self 将始终是 User 类(在为 User 类加载验证时)

请纠正我或建议是否有任何替代方案。提前致谢。

标签: ruby-on-railsrubyruby-on-rails-4activerecord

解决方案


您需要自定义验证

class User < ApplicationRecord
  validate :user_email_should_be_valid

  def user_email_should_be_valid
    email_field = user_structure.email_field
    email = send(email_field)

    if active? && !email.match?(EMAIL_REGEXP)
      errors.add(email_field.to_sym, "should be a valid email address")
    end
  end
end

推荐阅读