Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails custom validation based on a regex?

I have the following regex that I use in my routes.rb for /type-in-something-here

# A-Z, a-z, 0-9, _ in the middle but never starting or ending in a _
# At least 5, no more than 500 characters

In the routes this works well as:

match ':uuid' => 'room#show', :constraints => { :uuid => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/ }

I want to have this also as a validation so invalid records aren't created. So I added the following to room.rb:

validates_format_of :uuid, :with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i, :message => "Invalid! Alphanumerics only."

But this validates_format_of isn't working, and instead of adding an error it's allow the record to save.

Any ideas what's wrong?

Thanks

like image 839
AnApprentice Avatar asked Oct 06 '11 21:10

AnApprentice


3 Answers

validates :name, format: { with: /\A[a-zA-Z]+\z/,
message: "Only letters are allowed" }
like image 95
Nimish Avatar answered Oct 13 '22 15:10

Nimish


For validation purposes, remember to add the beginning and end of string markers \A and \Z:

validates_format_of :uuid, :with => /\A[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?\Z/i

Otherwise your regex will happily match any string that contains at least a letter or a digit. For some reason Rails implicitly adds the boundaries in the routes. (Probably because it embeds the regex inside a larger one to match the entire URL, with explicit checks for / and the end of the URL.)

like image 40
molf Avatar answered Oct 13 '22 13:10

molf


using something like this

validates :uuid, :format => {:with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i},
                 :message => "your message"

For more check this

like image 27
Nikhil Avatar answered Oct 13 '22 15:10

Nikhil