我想为电子邮件提交验证。但是有一些不同的方式。 我将允许用户以两种格式输入电子邮件,例如" name' email@example.com' " 和简单的' email@example.com' 。所以基本上我想写一个验证,它将检查当前的有效电子邮件格式价值与否。
只需要进行自定义验证即可检查输入电子邮件值中是否存在有效的电子邮件格式。
我的模特看起来像:
class Contact < ActiveRecord::Base
validates :email ,presence: true
validate :email_format
def email_format
??? what to write here ???
end
end
我如何为此编写验证。
答案 0 :(得分:3)
您需要稍微修改案例中的正则表达式。
validates :email, format: { with: /(\A([a-z]*\s*)*\<*([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\>*\Z)/i }
这将符合以下格式。
soundar.rathinsamy@gmail.com
Soundar<soundar.rathinsamy@gmail.com>
Soundar <soundar.rathinsamy@gmail.com>
soundar<soundar.rathinsamy@gmail.com>
Soundar Rathinsamy<soundar.rathinsamy@gmail.com>
Soundar Rathinsamy <soundar.rathinsamy@gmail.com>
soundar rathinsamy <soundar.rathinsamy@gmail.com>
如果您需要进行更改,请继续在rubular.com
编辑此正则表达式答案 1 :(得分:1)
validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i }
取自apidock.com:http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates
答案 2 :(得分:1)
此代码从电子邮件中提取&#34;&lt;&#34;之间的字符串。和&#34;&gt;&#34;但是,如果它没有找到匹配,则它会接收电子邮件中的最后一个字......在任何一种情况下,它都会接受该字符串并测试有效的电子邮件。
因此它适用于"John john@example.com"
和"John<john@example.com>"
def email_format
test_string = $1 if email =~ /\<([^\>]+)\>/
test_string = email.split(' ').last unless test_string
return if test_string =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
errors.add(:email, "not a valid email")
end