【问题标题】:Rails - validates_each to allow only certain Emails?Rails - validates_each 只允许某些电子邮件?
【发布时间】:2011-01-20 22:41:52
【问题描述】:

对于我的 rails3、设计、用户模型(姓名、电子邮件等),我想防止不良域在网站上注册。

我的想法是我有一个列入黑名单的域列表(badplace.com、hotmail.com)......当要保存新的用户记录时,我会检查电子邮件,如果它的域中有一个错误的域,我添加一个错误。

那么在 Rails 中巧妙地实现这一点的正确方法是什么...

这是我一直在玩的:

在用户模型中

protected
  validates_each :email, :on => :create do |record, attr, value|
     domain = email.split("@").last
     record.errors.add attr, "That's a BAD EMAIL." unless value && !value.contains(domain)
  end

你怎么看?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    您可以使用validates_format_of 和正则表达式更轻松地做到这一点:

    class User < ActiveRecord::Base
      validates_format_of :email, :without => /badplace\.com|hotmail\.com/, :message => "That's a BAD EMAIL."
    end
    

    编辑:

    对于许多地址,您可以这样做:

    INVALID_EMAILS = %w(badplace.com hotmail.com)
    validates_format_of :email, :without => /#{INVALID_EMAILS.map{|a| Regexp.quote(a)}.join('|')}/, :message => "That's a BAD EMAIL."
    

    【讨论】:

    • 感谢您指出这一点。这里的问题是我会收到几十封糟糕的电子邮件。可以不成为 var 吗?另外,消息有什么作用?我不想添加一个 record.errors 以便表单可以显示出了什么问题,请注意确定消息是否会自动执行?谢谢
    • 是的,消息会自动添加到record.errors。如果不指定,validates_format_of 的默认消息是“无效”。另外,我将在稍后更新我的答案,了解如何处理多个地址。
    • 是否有其他验证会干扰validates_format_of?这是我唯一能想到的。
    • 我刚刚尝试了与 Devise 和 Devise invitable 相同的代码。对我来说很好。您确定没有在模型上添加任何其他自定义验证吗?你能完整地发布模型吗?
    • 第 162 行:save(:validate =&gt; false)。我猜这就是问题所在。 :)
    猜你喜欢
    • 2014-01-10
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多