【问题标题】:Make an exception when validating emails验证电子邮件时例外
【发布时间】:2016-09-27 23:49:11
【问题描述】:

我目前有如下电子邮件验证:

validates :email, presence: true, length: { maximum: 255 },
            format: { with: VALID_EMAIL_REGEX, message: "Must be your 
            <domain name> email address." },
            uniqueness: { case_sensitive: false }

这将适用于我的应用程序的所有用户,除了一个没有属于所需域的电子邮件的管理员,由于某些情况,我无法为他创建一个。

我怎样才能允许该管理员使用他的电子邮件注册帐户,绕过常规的电子邮件验证?

【问题讨论】:

    标签: ruby-on-rails ruby validation email


    【解决方案1】:

    您可以尝试使用 validate: false 参数保存方法吗? 见here

    保存(选项={})

    可以通过传递 validate: false 来跳过保存时的验证过程。当验证模块混入时,常规的 #save 方法会被替换为 this,默认情况下是这样。

    保存!(options={})

    尝试像 #save 一样保存记录,但如果记录无效,则会引发 RecordInvalid 异常,而不是返回 false。

    您也可以查看answer

    UPD。如 cmets 所示,这对于关闭所有验证的少数(手动)管理员帐户创建很有用。

    【讨论】:

    • 如果您需要创建一次管理员记录(例如在控制台中) - 这已经足够了。
    • @nemo,在初始一次性创建管理员记录时尝试此操作,您将在未验证所需条目的情况下强制保存
    • 谢谢。我只有一个例外要添加,这似乎是最简单的方法!
    【解决方案2】:

    我会这样做:

    validates :email, presence: true, length: { maximum: 255 },
                format: { with: VALID_EMAIL_REGEX, message: "Must be your 
                <domain name> email address." },
                uniqueness: { case_sensitive: false },
                unless: ->(user) { user.admin? }
    

    【讨论】:

      【解决方案3】:

      您可以使用:ifunless 将条件传递给验证。所以像:

      validates :email, presence: true, length: { maximum: 255 },
        format: { with: VALID_EMAIL_REGEX, message: "Must be your 
        <domain name> email address." },
        uniqueness: { case_sensitive: false }, 
        unless: :admin?
      

      您必须定义方法admin? 来检查用户是否为管理员。

      【讨论】:

      • 我是 Rails 新手,在实施此解决方案时遇到了麻烦。我在哪里定义admin? 方法?这会奏效吗?如果用户尚未创建,如何检查用户是否为管理员?
      • 假设验证码在你的User类中,你必须将admin?定义为User的方法(方法名称是任意的,你可以选择任何你想要的名称) .在这种方法中,您必须设置谁是管理员的标准。这可能意味着使用白名单检查用户的“管理员”属性(如果有一个,或者像@hieupham 的另一个解决方案)。要回答您的最后一个问题,验证仅适用于类/模型的实例。您必须首先创建一个用户实例才能验证其电子邮件地址(在保存到数据库之前)。
      【解决方案4】:

      基本上,您提到的验证需要两件事:

      • 验证:uniqueness, length,这适用于adminnormal user
      • 验证:format,但 Admin 除外

      所以我的想法是为管理员创建一个白名单:

      validates :email, presence: true, length: { maximum: 255 }, uniqueness: { case_sensitive: false }
      
      validates format: { with: VALID_EMAIL_REGEX, message: "Must be your 
                  <domain name> email address." }, unless: :in_admin_whitelist?
      
      def in_admin_whitelist?
         email.in? ADMIN_WHITELIST
      end
      

      并且 ADMIN_WHITE_LIST 应该从环境变量中加载

      config/initializers/admin.rb

      ADMIN_WHITELIST = ENV['ADMIN_WHITELIST'].to_s.split(/,/)
      

      所以您可以在环境变量中设置的管理员白名单值格式如下:

      admin@admin.com,admin2@admin.com
      

      这将足够安全和​​灵活!

      【讨论】:

        猜你喜欢
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 2016-07-08
        • 1970-01-01
        • 2018-07-30
        • 2013-11-05
        • 2023-04-06
        相关资源
        最近更新 更多