Показать ошибку, если текст содержит определенные слова или строку в модели rails

#ruby-on-rails #ruby

#ruby-on-rails #рубиновый

Вопрос:

У меня есть модель Question , которая имеет следующие поля:

  • question:text
  • answer_1:text
  • answer_2:text
  • answer_3:text
  • answer_4:text

Я хочу запретить задавать вопросы, если они:

  • Есть слова "not" или "except" в вопросе,
  • Укажите слова "none of the above" или "all of the above" в полях ответа,
  • Начните с "true" , "false" , "yes" , или "no" в полях ответа, или
  • Имей "answer is" в ответе себя.

Комментарии:

1. Вам лучше посмотреть на guides.rubyonrails.org/active_record_validations.html#exclusion

2. validates :question, exlusion: { in: ["not", "except"], message: "not allowed"} не помогает, если в поле есть пробелы.

Ответ №1:

вы можете создать свой собственный валидатор в своей модели:

 validate :check_words, :on => :create
NOT_ALLOWED_WORDS = ["not", "except"]

 def check_words 
  errors.add :question, "not allowed" unless (NOT_ALLOWED_WORDS - only_words_from_question) == NOT_ALLOWED_WORDS
end


def only_words_from_question
  self.question.split(/W /)
end
 

Если после создания есть какое-либо слово «не разрешено», в obj.errors.full_messages должна быть ошибка «не разрешено».

Я думаю, это то, что вы ищете.

Комментарии:

1. Я проголосовал за этот ответ, поэтому, пожалуйста, кто-нибудь может сказать мне, что здесь не так? Кто-нибудь, пожалуйста.

Ответ №2:

Если http://guides.rubyonrails.org/active_record_validations.html#exclusion если это не работает для вас, вы можете попробовать использовать регулярное выражение:

В вашем контроллере, что-то вроде:

 @question = Question.new(question_params)
if params[:question] =~  /not/ || params[:answer] =~ /all of the above/ || what-so-ever-conditions
   raise "not accepted"
else
   @question.save
end
 

Однако это не очень хорошее решение, вместо этого вам следует попробовать то, что @pavan упомянул в своем комментарии.

Ответ №3:

Ниже я решаю свою проблему.

 validate :check_question, :on => :create
DISALLOW_QUESTION = ["not", "except"]

def check_question 
  DISALLOW_QUESTION.each do |w|
      errors.add :question, "shouldn't have '#{w}'", if question.include? w
  end
end

validate :check_answer, :on => :create
DISALLOW_ANSWER = ["none of the above", "all of the above", "answer is"]
START_WITH = ['true', 'false', 'yes', 'no']

def check_answer 
  DISALLOW_ANSWER.each do |w|
    errors.add :answer_1, "shouldn't have '#{w}'" if answer_1.include? w
    errors.add :answer_2, "shouldn't have '#{w}'" if answer_2.include? w
    errors.add :answer_3, "shouldn't have '#{w}'" if answer_3.include? w
    errors.add :answer_4, "shouldn't have '#{w}'" if answer_4.include? w
  end
  START_WITH.each do |w|
    errors.add :answer_1, "can't start with '#{w}'" if answer_1.start_with? w
    errors.add :answer_2, "can't start with '#{w}'" if answer_2.start_with? w
    errors.add :answer_3, "can't start with '#{w}'" if answer_3.start_with? w
    errors.add :answer_4, "can't start with '#{w}'" if answer_4.start_with? w
  end
end