app/models/rapidfire/question.rb in rapidfire-4.0.0 vs app/models/rapidfire/question.rb in rapidfire-5.0.0
- old
+ new
@@ -1,13 +1,14 @@
module Rapidfire
- class Question < ActiveRecord::Base
+ class Question < ApplicationRecord
belongs_to :survey, :inverse_of => :questions
has_many :answers
default_scope { order(:position) }
validates :survey, :question_text, :presence => true
+ validate :type_can_change
serialize :validation_rules
def self.inherited(child)
child.instance_eval do
def model_name
@@ -17,24 +18,53 @@
super
end
def rules
- validation_rules || {}
+ validation_rules.present? ? validation_rules.symbolize_keys : {}
end
+ def validation_rules=(val)
+ super(val.stringify_keys)
+ end
+
# answer will delegate its validation to question, and question
# will inturn add validations on answer on the fly!
def validate_answer(answer)
if rules[:presence] == "1"
- answer.validates_presence_of :answer_text
+ case self
+ when Rapidfire::Questions::File
+ if Rails::VERSION::MAJOR >= 6
+ answer.validates_presence_of :file
+ else
+ if !answer.file.attached?
+ answer.errors.add(:file, :blank)
+ end
+ end
+ when Rapidfire::Questions::MultiFile
+ if Rails::VERSION::MAJOR >= 6
+ answer.validates_presence_of :files
+ else
+ if !answer.files.attached?
+ answer.errors.add(:files, :blank)
+ end
+ end
+ else
+ answer.validates_presence_of :answer_text
+ end
end
if rules[:minimum].present? || rules[:maximum].present?
min_max = { minimum: rules[:minimum].to_i }
min_max[:maximum] = rules[:maximum].to_i if rules[:maximum].present?
answer.validates_length_of :answer_text, min_max
+ end
+ end
+
+ def type_can_change
+ if type_changed? && answers.any?
+ errors.add(:type, "cannot change after answers have been added")
end
end
end
end