module Formbuilder::Entry

Attributes

only_validate_page[RW]
skip_validation[RW]

Public Instance Methods

audit_responses() click to toggle source

Audits get run explicitly.

# File lib/formbuilder/entry.rb, line 177
def audit_responses
  form.response_fields.each do |response_field|
    response_field.audit_response(self.response_value(response_field), get_responses)
  end

  mark_responses_as_changed!
end
calculate_responses_text() click to toggle source
# File lib/formbuilder/entry.rb, line 147
def calculate_responses_text
  return unless self.respond_to?(:"#{responses_column}_text=")
  self.send(:"#{responses_column}_text=", get_responses.select { |k, v| Integer(k) rescue nil }.values.join(' '))
end
calculate_sortable_values() click to toggle source

for manual use, maybe when migrating

# File lib/formbuilder/entry.rb, line 153
def calculate_sortable_values
  response_fieldable.input_fields.each do |response_field|
    if (x = response_value(response_field)).present?
      get_responses["#{response_field.id}_sortable_value"] = response_field.sortable_value(x)
    end
  end

  mark_responses_as_changed!
end
destroy_response(response_field) click to toggle source
# File lib/formbuilder/entry.rb, line 136
def destroy_response(response_field)
  response_field.before_response_destroyed(self)
  id = response_field.id.to_s
  set_responses get_responses.reject { |k, v| k.in?([id, "#{id}_sortable_value"]) }
  mark_responses_as_changed!
end
error_for(response_field) click to toggle source
# File lib/formbuilder/entry.rb, line 143
def error_for(response_field)
  Array(self.errors.messages[:"#{responses_column}_#{response_field.id}"]).first
end
errors_on_page?(x) click to toggle source
# File lib/formbuilder/entry.rb, line 52
def errors_on_page?(x)
  pages_with_errors[x - 1] # 0-indexed
end
first_page_with_errors() click to toggle source
# File lib/formbuilder/entry.rb, line 38
def first_page_with_errors
  if (i = pages_with_errors.find_index { |x| x == true })
    i + 1
  else
    nil
  end
end
get_responses() click to toggle source
# File lib/formbuilder/entry.rb, line 64
def get_responses
  send(responses_column)
end
mark_responses_as_changed!() click to toggle source
# File lib/formbuilder/entry.rb, line 72
def mark_responses_as_changed!
  send("#{responses_column}_will_change!")
end
normalize_responses() click to toggle source

Normalizations get run before validation.

# File lib/formbuilder/entry.rb, line 164
def normalize_responses
  return if form.blank?

  form.response_fields.each do |response_field|
    if (x = self.response_value(response_field))
      response_field.normalize_response(x, get_responses)
    end
  end

  mark_responses_as_changed!
end
pages_with_errors() click to toggle source
# File lib/formbuilder/entry.rb, line 46
def pages_with_errors
  form.response_fields_by_page.map do |page|
    page.find { |response_field| self.error_for(response_field).present? } ? true : false
  end
end
response_value(response_field) click to toggle source
# File lib/formbuilder/entry.rb, line 101
def response_value(response_field)
  value = get_responses[response_field.id.to_s]

  if value
    response_field.serialized ? YAML::load(value) : value
  elsif !value && response_field.serialized && response_field.field_type != 'checkboxes'
    {}
  else # for checkboxes, we need to know the difference between no value and none selected
    nil
  end
end
responses_column() click to toggle source
# File lib/formbuilder/entry.rb, line 56
def responses_column
  @responses_column || 'responses'
end
responses_column=(x) click to toggle source
# File lib/formbuilder/entry.rb, line 60
def responses_column=(x)
  @responses_column = x
end
responses_column_changed?() click to toggle source
# File lib/formbuilder/entry.rb, line 76
def responses_column_changed?
  send("#{responses_column}_changed?")
end
responses_column_was() click to toggle source
# File lib/formbuilder/entry.rb, line 80
def responses_column_was
  send("#{responses_column}_was")
end
save_response(raw_value, response_field, response_field_params = {}) click to toggle source
# File lib/formbuilder/entry.rb, line 122
def save_response(raw_value, response_field, response_field_params = {})
  value = response_field.transform_raw_value(raw_value, self, response_field_params: response_field_params)

  if value.present?
    get_responses["#{response_field.id}"] = response_field.serialized ? value.to_yaml : value
    get_responses["#{response_field.id}_sortable_value"] = response_field.sortable_value(value)
  else
    get_responses.delete("#{response_field.id}")
    get_responses.delete("#{response_field.id}_sortable_value")
  end

  mark_responses_as_changed!
end
save_responses(response_field_params, response_fields, opts = {}) click to toggle source
# File lib/formbuilder/entry.rb, line 113
def save_responses(response_field_params, response_fields, opts = {})
  set_responses({}) unless opts[:partial_update]
  response_field_params ||= {}

  response_fields.select { |rf| rf.input_field }.each do |response_field|
    self.save_response(response_field_params[response_field.id.to_s], response_field, response_field_params)
  end
end
set_responses(x) click to toggle source
# File lib/formbuilder/entry.rb, line 68
def set_responses(x)
  send("#{responses_column}=", x)
end
valid_page?(x) click to toggle source
# File lib/formbuilder/entry.rb, line 33
def valid_page?(x)
  self.valid?
  !self.errors_on_page?(x)
end
value_present?(response_field) click to toggle source
# File lib/formbuilder/entry.rb, line 84
def value_present?(response_field)
  value = self.response_value(response_field)

  # value isn't blank (ignore hashes)
  return true if (value && value.present? && !value.is_a?(Hash))

  # no options are available
  return true if (response_field.options_field && Array(response_field.field_options["options"]).empty?)

  # there is at least one value (for hashes)
  # reject select fields
  return true if (value.is_a?(Hash) && value.reject { |k, v| k.in? ['am_pm', 'country'] }.find { |k, v| v.present? })

  # otherwise, it's not present
  return false
end