Module: TentSteakFeatures::TableController

Defined in:
lib/tent_steak/table.rb

Overview

TentSteak controller methods for :table feature. Provides a helper method to extract changed fields from a POSTed table form.

Instance Method Summary collapse

Instance Method Details

#extract_form_fields(field_hash, form_prefix = "TS", selected_only = false) ⇒ Object

Extract changed field values from a POSTed form table; the counterpart to #tablerow() options :text_columns and :select_columns. field_hash can be @input from the POST. The POST field values are filtered according to the :form_prefix passed to #tablerow().

selected_only determines whether or not to filter entire rows according to whether the leading select checkbox is checked (see :select_row). By default, the select checkbox is ignored. You should only set selected_only to true for tables with :select_row set.



702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
# File 'lib/tent_steak/table.rb', line 702

def extract_form_fields(field_hash, form_prefix = "TS", selected_only = false)
  changed = {}

  # Reject fields that don't start with form_prefix, or that are 'ts_selected' indicators.
  # We'll handle ts_selected in selected_fields below.
  form_fields = field_hash.reject { |key, value| (key =~ /^#{form_prefix}/).nil? ||
    key =~ /ts_selected$/ }

  # Ignore fields not selected (see #tablerow option :select_row).
  selected_fields = field_hash.reject { |key, value|
    (key =~ /^#{form_prefix}__.*__ts_selected$/).nil? }.keys.map { |key| key.split('__')[1] } if selected_only

  form_fields.each do |key, value|
    prefix, row_key, field_name, old_value = key.split('__')

    # Skip fields that didn't change or aren't selected.
    next if form_fields[key] == old_value || (selected_only && !selected_fields.include?(row_key))

    (changed[row_key] ||= {})[field_name] = value
  end
  changed
end