#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