Class: Fe::Question
- Includes:
- ActionView::RecordIdentifier
- Defined in:
- app/models/fe/question.rb
Direct Known Subclasses
AttachmentField, ChoiceField, DateField, PaymentQuestion, 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(answer_sheet) ⇒ Object
-
#has_response?(answer_sheet = nil) ⇒ Boolean
has any sort of non-empty response?.
- #locked?(params, answer_sheet, presenter) ⇒ Boolean
- #required?(answer_sheet = nil) ⇒ Boolean
-
#response(answer_sheet) ⇒ Object
shortcut to return first answer.
- #responses(answer_sheet) ⇒ Object
- #save_file(answer_sheet, file) ⇒ Object
-
#save_response(answer_sheet) ⇒ Object
save this question’s @answers to database.
-
#set_response(values, answer_sheet) ⇒ Object
set answers from posted response.
-
#validation_class(answer_sheet = nil) ⇒ Object
css class names for javascript-based validation.
Methods inherited from Element
#all_elements, #conditional_match, #duplicate, #limit, max_label_length, #page_id, #position, #previous_element, #ptemplate, #question?, #reuseable?, #set_conditional_element, #set_position, #update_any_previous_conditional_elements
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
48 49 50 |
# File 'app/models/fe/question.rb', line 48 def answers @answers end |
Instance Method Details
#default_label? ⇒ Boolean
element view provides the element label with required indicator
77 78 79 |
# File 'app/models/fe/question.rb', line 77 def default_label? true end |
#display_response(answer_sheet) ⇒ Object
129 130 131 132 133 134 135 136 |
# File 'app/models/fe/question.rb', line 129 def display_response(answer_sheet) r = responses(answer_sheet) if r.blank? "" else r.join(", ") end end |
#has_response?(answer_sheet = nil) ⇒ Boolean
has any sort of non-empty response?
237 238 239 240 241 242 243 244 245 246 247 248 249 |
# File 'app/models/fe/question.rb', line 237 def has_response?(answer_sheet = nil) if answer_sheet.present? answers = responses(answer_sheet) else answers = Fe::Answer.where(:question_id => self.id) end return false if answers.length == 0 answers.each do |answer| # loop through Answers value = answer.is_a?(Fe::Answer) ? answer.value : answer return true if (value.is_a?(FalseClass) && value === false) || value.present? end false end |
#locked?(params, answer_sheet, presenter) ⇒ Boolean
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'app/models/fe/question.rb', line 81 def locked?(params, answer_sheet, presenter) return true unless ['fe/answer_pages', 'fe/reference_sheets'].include?(params['controller']) && params['action'] == 'edit' if self.object_name == 'person.current_address' && ['address1','address2','city','zip','email','state','country'].include?(self.attribute_name) # Billing Address return false elsif self.object_name == 'person.emergency_address' && ['address1','address2','city','zip','email','state','country','contactName','homePhone','workPhone'].include?(self.attribute_name) # Emergency Contact return false elsif self.label == 'Relationship To You' || self.style == "country" || (self.style == "email" && self.label == "Confirm Email") # Relationship & Country & Email Address return false else return answer_sheet.frozen? && !presenter.reference? end end |
#required?(answer_sheet = nil) ⇒ Boolean
251 252 253 |
# File 'app/models/fe/question.rb', line 251 def required?(answer_sheet = nil) super end |
#response(answer_sheet) ⇒ Object
shortcut to return first answer
125 126 127 |
# File 'app/models/fe/question.rb', line 125 def response(answer_sheet) responses(answer_sheet).first.to_s end |
#responses(answer_sheet) ⇒ Object
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'app/models/fe/question.rb', line 138 def responses(answer_sheet) return [] unless answer_sheet # try to find answer from external object if !object_name.blank? and !attribute_name.blank? obj = %w(answer_sheet application reference).include?(object_name) ? answer_sheet : eval("answer_sheet." + object_name) if obj.nil? or eval("obj." + attribute_name + ".nil?") [] else [eval("obj." + attribute_name)] end else #answer_sheet.answers_by_question[id] || [] Fe::Answer.where(:answer_sheet_id => answer_sheet.id, :question_id => self.id).to_a end end |
#save_file(answer_sheet, file) ⇒ Object
209 210 211 212 |
# File 'app/models/fe/question.rb', line 209 def save_file(answer_sheet, file) @answers.collect(&:destroy) if @answers Fe::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
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'app/models/fe/question.rb', line 215 def save_response(answer_sheet) unless @answers.nil? for answer in @answers if answer.is_a?(Fe::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, answer_sheet) ⇒ Object
set answers from posted response
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'app/models/fe/question.rb', line 156 def set_response(values, answer_sheet) values = Array.wrap(values) if !object_name.blank? and !attribute_name.blank? # if eval("answer_sheet." + object_name).present? object = %w(answer_sheet application).include?(object_name) ? answer_sheet : eval("answer_sheet." + object_name) unless object.present? if object_name.include?('.') objects = object_name.split('.') object = eval("answer_sheet." + objects[0..-2].join('.') + ".create_" + objects.last) eval("answer_sheet." + objects[0..-2].join('.')).reload end end unless responses(answer_sheet) == values value = values.first if self.is_a?(Fe::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 = Fe::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 = nil) ⇒ Object
css class names for javascript-based validation
98 99 100 101 102 103 104 |
# File 'app/models/fe/question.rb', line 98 def validation_class(answer_sheet = nil) if required?(answer_sheet) ' required ' else '' end end |