AnApprentice
AnApprentice

Reputation: 110960

Rails - Allowing for calling in Model Validation in a Controller

I have the following in my user.rb model:

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

For various reasons, I want to be able to use this logic in my controller to check an email's input before it is user.created, which is when the above normall runs.

How can I turn the above into a method that I can call in controllers other than user? Possible?

And if is called and returned false I then want to do errors.add so I can let the user know why?

Thanks

Trying:

  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

Update:

..
  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

Upvotes: 0

Views: 1425

Answers (2)

Mblake
Mblake

Reputation: 383

Okay, if I understand you.

You want to do something like below:

u = User.new
u.email = "[email protected]"
if !u.valid?
  puts u.errors.to_xml 
  //do something
  return
end

What you do with those errors is going to come down to how you want those reported back, usually I just shoot them back as xml into a flash[:error], which is the normal default behavior if you're doing scaffolds. The puts is there so you can see how to access the errors.

Additional

As a rule try to avoid duplicating validation logic. Rails provides everything you need for validating without creating different methods in different places to accomplish the same thing.

Upvotes: 1

Ryan Bigg
Ryan Bigg

Reputation: 107718

You cannot assign a constant inside a method, because that would make it "dynamic constant assignment". Instead, define this constant in your model class and then reference it in your controller by using User::INVALID_EMAILS

Upvotes: 1

Related Questions