module Rapidfire class QuestionForm < Rapidfire::BaseService AVAILABLE_QUESTIONS = [ Rapidfire::Questions::Checkbox, Rapidfire::Questions::Date, Rapidfire::Questions::Long, Rapidfire::Questions::Numeric, Rapidfire::Questions::Radio, Rapidfire::Questions::Select, Rapidfire::Questions::Short, Rapidfire::Questions::Information, Rapidfire::Questions::File, Rapidfire::Questions::MultiFile, ] QUESTION_TYPES = AVAILABLE_QUESTIONS.inject({}) do |result, question| question_name = question.to_s.split("::").last result[question_name] = question.to_s result end attr_accessor :survey, :question, :default_text, :placeholder, :type, :question_text, :position, :answer_options, :answer_presence, :answer_minimum_length, :answer_maximum_length, :answer_greater_than_or_equal_to, :answer_less_than_or_equal_to delegate :valid?, :errors, :to => :question def initialize(params = {}) from_question_to_attributes(params[:question]) if params[:question] super(params) @question ||= survey.questions.new end def save @question.new_record? ? create_question : update_question end private def create_question klass = nil if QUESTION_TYPES.values.include?(type) klass = type.constantize else errors.add(:type, :invalid) return false end @question = klass.create(to_question_params) end def update_question @question.update(to_question_params) end def to_question_params { :type => type, :survey => survey, :question_text => question_text, :position => position, :default_text => default_text, :placeholder => placeholder, :answer_options => answer_options, :validation_rules => { :presence => answer_presence, :minimum => answer_minimum_length, :maximum => answer_maximum_length, :greater_than_or_equal_to => answer_greater_than_or_equal_to, :less_than_or_equal_to => answer_less_than_or_equal_to } } end def from_question_to_attributes(question) self.type = question.type self.survey = question.survey self.question_text = question.question_text self.position = question.position self.default_text = question.default_text self.placeholder = question.placeholder self.answer_options = question.answer_options self.answer_presence = question.rules[:presence] self.answer_minimum_length = question.rules[:minimum] self.answer_maximum_length = question.rules[:maximum] self.answer_greater_than_or_equal_to = question.rules[:greater_than_or_equal_to] self.answer_less_than_or_equal_to = question.rules[:less_than_or_equal_to] end end end