2012-06-26 3 views
0

В моей модели рельсов у меня есть какая-то система шаблонов. Я хочу, чтобы пользователи, редактирующие его, не делали случайных ошибок, поэтому я использую несколько простых валидаторов.Negate regex of validates_format_of

Они могут использовать маркеры, такие как ##user_id##, которые будут заменены позже. Я хочу убедиться, что они не вводят что-то вроде ###user_id##, которое содержит слишком много #, поэтому в поле не должно быть ### (или ####).

class Template 
    validates_format_of :text, :with => /##user_id##/, 
    :message => "##user_id## must be present" 
    validates_format_of :text, :not_with => /###/, 
    :message => "Too many #" 
end 

К сожалению, нет :not_with варианта ... есть ли возможность решить эту проблему с помощью :with -regex или я должен идти отдельный validate метод?

Я пробовал некоторые негативные перспективы, но, как есть (в основном) несколько ## и только один ### они всегда соответствуют одному из них.

ответ

1

Что об этом ...

validates_format_of :text, :with => /(^|[^#])##user_id##($|[^#])/ 

EDIT: Я скопировал rubular примеры acheong87 с моим регулярным выражением.

+0

работает как шарм, спасибо :-) – arnep

+1

@arnep вы радушны. Рад помочь. – Kyle

0

Вы можете сделать что-то подобное?

/^(.(?!###+user_id##|##user_id###+))*$/ 

Прогон: Демо-версия: http://rubular.com/r/SPwsyDlj0y.

В (более) Английский, он говорит,

Строка, в которой ни один символ не следует ###+user_id## или ##user_id###+.

+0

Это какой-то запрос, который я пробовал раньше, но, к сожалению, он не работает с 'validates_format_of' – arnep

4

Используйте :without вариант:

validates_format_of :text, :without => /###/, :message => "Too many #"