我的user.rb模型中有以下内容:
INVALID_EMAILS = %w(gmail.com hotmail.com)
validates_format_of :email, :without => /#{INVALID_EMAILS.map{|a| Regexp.quote(a)}.join('|')}/, :message => "That email domain won't do.", :on => :create
由于各种原因,我希望能够在我的控制器中使用此逻辑来检查电子邮件的输入,然后才能使用user.created,即上述规范运行时。
如何将上述内容转换为可以在用户以外的控制器中调用的方法?可能的?
如果被调用并返回false,那么我想做error.add所以我可以让用户知道为什么?
由于
尝试:
def validate_email_domain(emailAddy)
INVALID_EMAILS = %w(gmail.com googlemail.com yahoo.com ymail.com rocketmail.com hotmail.com facebook.com)
reg = Regexp.new '/#{INVALID_EMAILS.map{|a| Regexp.quote(a)}.join('|')}/'
self.errors.add('rox', 'Hey, Ruby rox. You have to say it !') unless reg.match attribute
end
更新
..
Rails.logger.info validate_email_domain(email)
...
def valid_email_domain(emailAddy)
reg = Regexp.new '/#{User::INVALID_EMAILS.map{|a| Regexp.quote(a)}.join("|")}/'
return true if emailAddy.scan(reg).size == 0
end
答案 0 :(得分:1)
您不能在方法内部分配常量,因为这会使其成为“动态常量赋值”。相反,在模型类中定义此常量,然后使用User::INVALID_EMAILS
答案 1 :(得分:1)
好的,如果我了解你。
您想要执行以下操作:
u = User.new
u.email = "jsmith@gmail.com"
if !u.valid?
puts u.errors.to_xml
//do something
return
end
你对这些错误的处理方式将取决于你想要回报的方式,通常我只是将它们作为xml射回flash [:error],如果你正在做支架,这是正常的默认行为。看跌期权就在那里,您可以看到如何访问错误。
附加
通常尽量避免重复验证逻辑。 Rails提供验证所需的一切,而无需在不同的地方创建不同的方法来完成同样的事情。