validates_format_of для исключения определенных шаблонов - PullRequest
1 голос
/ 17 июля 2010

Я хочу, чтобы модель рельсов исключала определенные шаблоны: пробеги двух или более пробелов.

User.name = "Harry Junior Potter" допустимо, но User.name = "Harry Junior Potter" - нет (два пробела между Гарри и Джуниором). Это позволяет избежать кражи личных данных, когда эти два имени отображаются одинаково (HTML сжимает пробелы).

Другими словами: разрешено: [0-9A-z_-] и «\s только в серии по одному».

Мое регулярное выражение слишком слабое, чтобы создать такое регулярное выражение, это то, что у меня есть (с отрицательным прогнозом , но оно не совпадает правильно.

 /([0-9A-z_\-])(\s(?!\s))?/

Примечание: ловушка before_validation уже strip () содержит все элементы, поэтому пробелы в начале или конце строки не являются проблемой.

Ответы [ 3 ]

1 голос
/ 17 июля 2010

Во-первых, [A-z] - ошибка.Это эквивалентно

[A-Z\[\\\]^_`a-z]

... и я уверен, что это не то, что вы имели в виду.Вы должны прописать два диапазона отдельно: [A-Za-z].Но в этом случае вы также сопоставляете цифры и подчеркивание, поэтому вы можете использовать \w, как это сделал @Sjuul: [\w-]+.Это делает ваше регулярное выражение

/^[\w-]+(?: [\w-])*$/

Конечно, это будет соответствовать глупым вещам, таким как -- - ---, а не будет соответствовать многим реальным именам.Я просто отвечаю на ваш вопрос о том, чтобы разрешить только один пробел между именами.

1 голос
/ 17 июля 2010

Разве не проще просто заменить "__" with "_"? (Используя подчеркивание, чтобы показать пробелы) Мой Ruby не очень хорошо говорит, но это должно быть что-то вроде

User.name.replace!("  ", " ") while User.name.contains("  ")

Тогда вы можете использовать это регулярное выражение для проверки остальных

([\w\-]+\s?)+
0 голосов
/ 17 июля 2010

Я бы предложил альтернативный маршрут ... на самом деле очень странный.Если вы переживаете нехватку времени и не хотите иметь дополнительный столбец в существующей таблице, тогда я бы предложил создать фрагмент имени пользователя.Я знаю, это излишне для вашей проблемы.Но я предпочитаю делать свои проверки таким образом.Вместо того, чтобы сравнивать новое имя пользователя с уже сохраненным (и ломать голову над всеми этими грязными регулярными выражениями), я просто проверяю новый слаг против сохраненного слага (который, кстати, обрабатывает все эти грязные регулярные выражения для вас).Вы можете проверить to_slug : http://github.com/ludo/to_slug

Слагы используются в основном для фильтрации опасных символов из URL-адресов.Почему бы не использовать то же самое для проверки имен пользователей?Он также обрабатывает символы Юникода.

Это не прямой ответ на вашу проблему.Но я столкнулся с той же ситуацией, что и вы, и, поскольку у меня были проблемы с временем, я решил использовать слагов.

Простая проверка в моей консоли дает:

>> "Harry Junior Potter".to_slug
=> "harry-junior-potter"
>> "Harry  Junior  Potter".to_slug
=> "harry-junior-potter"
>> "Harry         Junior           Potter".to_slug
=> "harry-junior-potter"
>> "Harry(junior(potter))".to_slug
=> "harry-junior-potter"
>> "Harry_Junior_Potter".to_slug
=> "harry_junior_potter"

Итак, теперь, еслии только если слаг проверяет пользователя, ему разрешено сохранять свое имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...