Rails custom validation based on a regex?

匿名 (未验证) 提交于 2019-12-03 02:15:02

问题:

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

回答1:

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



回答2:

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



回答3:

validates :name, format: { with: /\A[a-zA-Z]+\z/, message: "Only letters are allowed" }


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!