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.

  1. Добавьте в Gemfile следующее:

    gem 'obscenity'
    
  2. Выполните в терминале:

    bundle install
    
  3. Измените модель обзора следующим образом:

     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

Другие вопросы по тегам