2014-09-17 2 views
1

Я получаю много сообщений на свой общедоступный сайт на разных языках, но хочу ограничить его только английскими символами. Есть ли простой способ сделать это? Должен ли я просто выполнять валидацию с лимитирующими регулярными выражениями или есть общие проблемы с этим методом?Как вы можете ограничить использование английских символов в Rails?

Примечание: текст не будет содержать HTML или любую другую разметку. Это должен быть просто текст, может быть, с обычными символами, например, тире, точками и т. Д.

+1

Это зависит от того, на каком языке вы хотите предотвратить. Если они являются языковыми языками, тогда забудьте об этом. Около десятка или более языков используют один и тот же буквенный набор и даже больше используют одно и то же подмножество букв. Не говоря уже о том, что у англичан есть акценты, такие как наивные. – Mohamad

+0

Ну, я бы не прочь ограничивать такие слова, как наивные. Но я пытаюсь уменьшить представления на арабском языке, различные кириллические алфавиты и т. Д. – you786

+0

См. Мой ответ. – Mohamad

ответ

-1

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

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

Если необходимо, и вы хотите заблокировать не-латинские символы, вы можете написать собственный валидатор.

class LatinCharsetValidator < ActiveModel::EachValidator 
    # Regex taken from this answer http://stackoverflow.com/a/13671443/276959 
    LATIN_CHARSET_REGEX = /[\p{L}&&[^a-zA-Z]]/ 

    def validate_each(object, attribute, value) 
    object.errors.add(attribute) if value =~ LATIN_CHARSET_REGEX 
    end 
end 

Вы можете назвать этот валидатор в вашей модели, как, например:

class Comment < ActiveRecord::Base 
    validates :comment, latin_charset: true 
end 

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

Я считаю, что это плохая идея. Вы не можете контролировать, что люди в конечном итоге пишут или вставляют в текстовую область, и вы можете закончить блокировку законных комментариев. Что, если кто-то хочет включить чужое слово, пытаясь объяснить это? Лучше вежливо попросить своих пользователей только прокомментировать на английском языке.

Если ваша проблема в спаме, однако, вам лучше реализовать honeypot или какой-либо другой тип защиты от спама.

0

validates :comment, format: { with: [a-zA-Z0-9\s]+, on: :create } - или другое действие

Смежные вопросы