0

我正在使用 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"}

但这样做的问题是,它只适用于只有这些词的评论,例如,如果你输入“shit film”,它会允许它,但它不会允许单个词“shit”。

有人可以帮忙吗。

评论.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
4

3 回答 3

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

于 2015-03-25T16:31:25.200 回答
2

另一个更简单的选择是使用Obscenity gem。

  1. 将以下内容添加到 Gemfile:

    gem 'obscenity'
    
  2. 在终端执行:

    bundle install
    
  3. 以这种方式修改您的 Review 模型:

     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 年以来不再维护,但我正在使用 rails 6 进行生产,它仍然有效。

于 2020-11-18T16:10:55.637 回答
0

它真的不像 validate 那样工作,我应该知道我按照你的方式尝试过,Matt。

要创建自定义验证,您需要创建一个这样的类:

    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 目录

于 2017-07-24T15:54:31.307 回答