Class: Qe::Question
- Includes:
- ActionController::RecordIdentifier
- Defined in:
- app/models/qe/question.rb
Direct Known Subclasses
AttachmentField, ChoiceField, DateField, ReferenceQuestion, StateChooser, TextField
Instance Attribute Summary collapse
-
#answers ⇒ Object
a question has one response per AnswerSheet (that is, an instance of a user filling out the question) generally the response is a single answer however, “Choose Many” (checkbox) questions have multiple answers in a single response.
Instance Method Summary collapse
-
#default_label? ⇒ Boolean
element view provides the element label with required indicator.
- #display_response(app) ⇒ Object
-
#has_response?(answer_sheet = nil) ⇒ Boolean
has any sort of non-empty response?.
- #required?(answer_sheet = nil) ⇒ Boolean
-
#response(app) ⇒ Object
shortcut to return first answer.
- #responses(app) ⇒ Object
- #save_file(answer_sheet, file) ⇒ Object
-
#save_response(answer_sheet) ⇒ Object
save this question’s @answers to database.
-
#set_response(values, app) ⇒ Object
set answers from posted response.
-
#validation_class(answer_sheet) ⇒ Object
css class names for javascript-based validation.
Methods inherited from Element
#all_elements, #duplicate, max_label_length, #position, #ptemplate, #question?, #reuseable?, #set_position
Instance Attribute Details
#answers ⇒ Object
a question has one response per AnswerSheet (that is, an instance of a user filling out the question) generally the response is a single answer however, “Choose Many” (checkbox) questions have multiple answers in a single response
35 36 37 |
# File 'app/models/qe/question.rb', line 35 def answers @answers end |
Instance Method Details
#default_label? ⇒ Boolean
element view provides the element label with required indicator
64 65 66 |
# File 'app/models/qe/question.rb', line 64 def default_label? true end |
#display_response(app) ⇒ Object
100 101 102 103 104 105 106 107 |
# File 'app/models/qe/question.rb', line 100 def display_response(app) r = responses(app) if r.blank? "" else r.join(", ") end end |
#has_response?(answer_sheet = nil) ⇒ Boolean
has any sort of non-empty response?
207 208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'app/models/qe/question.rb', line 207 def has_response?(answer_sheet = nil) if answer_sheet.present? answers = responses(answer_sheet) else answers = Answer.where(:question_id => self.id) end return false if answers.length == 0 answers.each do |answer| # loop through Answers value = answer.is_a?(Answer) ? answer.value : answer return true if (value.is_a?(FalseClass) && value === false) || value.present? end return false end |
#required?(answer_sheet = nil) ⇒ Boolean
221 222 223 |
# File 'app/models/qe/question.rb', line 221 def required?(answer_sheet = nil) super() || (!answer_sheet.nil? && !choice_field.nil? && choice_field.has_answer?('1', answer_sheet)) end |
#response(app) ⇒ Object
shortcut to return first answer
96 97 98 |
# File 'app/models/qe/question.rb', line 96 def response(app) responses(app).first.to_s end |
#responses(app) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'app/models/qe/question.rb', line 109 def responses(app) return [] unless app # try to find answer from external object if !object_name.blank? and !attribute_name.blank? obj = object_name == 'application' ? app : eval("app." + object_name) if obj.nil? or eval("obj." + attribute_name + ".nil?") [] else [eval("obj." + attribute_name)] end else app.answers_by_question[id] || [] # Answer.where(:answer_sheet_id => app.id, :question_id => self.id) end end |
#save_file(answer_sheet, file) ⇒ Object
179 180 181 182 |
# File 'app/models/qe/question.rb', line 179 def save_file(answer_sheet, file) @answers.collect(&:destroy) if @answers answer = Answer.create!(:question_id => self.id, :answer_sheet_id => answer_sheet.id, :attachment => file) end |
#save_response(answer_sheet) ⇒ Object
save this question’s @answers to database
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
# File 'app/models/qe/question.rb', line 185 def save_response(answer_sheet) unless @answers.nil? for answer in @answers if answer.is_a?(Answer) answer.answer_sheet_id = answer_sheet.id answer.save! end end end # remove others unless @mark_for_destroy.nil? for answer in @mark_for_destroy answer.destroy end @mark_for_destroy.clear end rescue TypeError raise answer.inspect end |
#set_response(values, app) ⇒ Object
set answers from posted response
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'app/models/qe/question.rb', line 126 def set_response(values, app) values = Array.wrap(values) if !object_name.blank? and !attribute_name.blank? # if eval("app." + object_name).present? object = object_name == 'application' ? app : eval("app." + object_name) unless object.present? if object_name.include?('.') objects = object_name.split('.') object = eval("app." + objects[0..-2].join('.') + ".create_" + objects.last) eval("app." + objects[0..-2].join('.')).reload end end unless responses(app) == values value = ActiveRecord::Base.connection.quote_string(values.first) if self.is_a?(DateField) && value.present? begin value = Date.strptime(value, (I18n.t 'date.formats.default')) rescue raise "invalid date - " + value.inspect end end object.update_attribute(attribute_name, value) end # else # raise object_name.inspect + ' == ' + attribute_name.inspect # end else @answers ||= [] @mark_for_destroy ||= [] # go through existing answers (in reverse order, as we delete) (@answers.length - 1).downto(0) do |index| # reject: skip over responses that are unchanged unless values.reject! {|value| value == @answers[index]} # remove any answers that don't match the posted values @mark_for_destroy << @answers[index] # destroy from database later @answers.delete_at(index) end end # insert any new answers for value in values if @mark_for_destroy.empty? answer = Answer.new(:question_id => self.id) else # re-use marked answers (an update vs. a delete+insert) answer = @mark_for_destroy.pop end answer.set(value) @answers << answer end end end |
#validation_class(answer_sheet) ⇒ Object
css class names for javascript-based validation
69 70 71 72 73 74 75 |
# File 'app/models/qe/question.rb', line 69 def validation_class(answer_sheet) if self.required?(answer_sheet) ' required ' else '' end end |