Ruby on Rails Stop Ненормативная лексика
Я создаю сайт с использованием Ruby on Rails и добавляю систему обзора. Я хочу, чтобы пользователи не ругались в своих обзорах и попробовали следующие драгоценные камни, чтобы сделать это:
validates_decency_of
NoNo
Fu-Fu
Единственное, что подошло ближе - это использование исключения:
validates :review_text, :exclusion => { :in => %w(shit fuck fucking twat bitch), :message => "you must not enter swear words"}
Но проблема в том, что он будет работать только с рецензиями, в которых есть только эти слова, например, если вы наберете "фильм дерьмо", это разрешит, но не допустит одно слово "дерьмо".
Может кто-нибудь, пожалуйста, помогите.
review.rb:
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :film
validates :review_text, :presence => { :message => "Please enter a review"}
validates :review_text, :length => {:maximum => 2000, :message => "The review must not exceed 2000 characters"}
validates :review_text, length: { maximum: 2000 }
end
2 ответа
Похоже, вы можете захотеть добавить пользовательский метод проверки. Что-то вроде:
validate :text_must_be_decent
def text_must_be_decent
if review_text.include?(... list of forbidden words...)
errors.add(:review_text, 'Wash your mouth out with soap!')
end
end
Смотрите также http://guides.rubyonrails.org/active_record_validations.html
Другой более простой вариант - использовать самоцвет Obscenity.
Добавьте в Gemfile следующее:
gem 'obscenity'
Выполните в терминале:
bundle install
Измените модель обзора следующим образом:
class Review < ActiveRecord::Base belongs_to :user belongs_to :film validates :review_text, :presence => { :message => "Please enter a review" } validates :review_text, :length => { :maximum => 2000, :message => "The review must not exceed 2000 characters" } validates :review_text, obscenity: true end
Вот и все. Проект больше не поддерживается с 2016 года, но я использую его в продакшене с рельсами 6, и он все еще работает.
Это действительно не так работает с validate, и я должен знать, что попробовал по-твоему, Мэтт.
чтобы создать пользовательскую проверку, вам нужно создать такой класс:
class myValidator < ActiveModel::Validator
def validate(record)
if record.review_text.present?
@review_text = record.review_text.dup
@review_text.downcase!
@bad_keywords = ["bad_word","another_bad_word",....]
@bad_keywords.each do |word|
if @review_text.include? word
record.errors[:review_text] << 'Wash your mouth out with soap!'
end
end
end
end
end
и внутри вашей модели:
include ActiveModel::Validations
validates_with myValidator
вы можете поместить "myValidator" в вашу модель или вы можете поместить его в директорию lib