2015-03-25 3 views
0

Я создаю сайт для кино с использованием Ruby on Rails и добавляю в систему обзора. Я хочу, чтобы запретить пользователям ругань в своих обзорах и испробованы следующие драгоценные камни, чтобы сделать это:Ruby on Rails Stop Profanity

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 

ответ

3

Похоже, вы можете добавить метод пользовательские проверки. Что-то вроде:

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#performing-custom-validations

+2

Очень информативное сообщение об ошибке :-D –

+0

Это не работает, это позволит только одной работе в вашем «списке запрещенных слов» –

+0

Правильно, вам нужно настроить это сообщение проверки в соответствии с вашими потребностями. – Matt

0

это действительно не работает, как, что с 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 dir