Rails - 允许在Controller中调用模型验证

时间:2011-01-21 05:01:32

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

我的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

2 个答案:

答案 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提供验证所需的一切,而无需在不同的地方创建不同的方法来完成同样的事情。