Sha256: 1e22d1287fd616a642fc9d3fd8b73f1b78b0fb605b27789c66b866b8abe4a241

Contents?: true

Size: 1.69 KB

Versions: 12

Compression:

Stored size: 1.69 KB

Contents

module Reform::Form::MultiParameterAttributes
  # TODO: implement this with parse_filter, so we don't have to manually walk through the hash, etc.
  class DateTimeParamsFilter
    def call(params)
      params = params.dup # DISCUSS: not sure if that slows down form processing?
      date_attributes = {}

      params.each do |attribute, value|
        if value.is_a?(Hash)
          params[attribute] = call(value) # TODO: #validate should only handle local form params.
        elsif matches = attribute.match(/^(\w+)\(.i\)$/)
          date_attribute = matches[1]
          date_attributes[date_attribute] = params_to_date(
            params.delete("#{date_attribute}(1i)"),
            params.delete("#{date_attribute}(2i)"),
            params.delete("#{date_attribute}(3i)"),
            params.delete("#{date_attribute}(4i)"),
            params.delete("#{date_attribute}(5i)")
          )
        end
      end

      date_attributes.each do |attribute, date|
        params[attribute] = date
      end
      params
    end

  private
    def params_to_date(year, month, day, hour, minute)
      date_fields = [year, month, day].map!(&:to_i)
      time_fields = [hour, minute].map!(&:to_i)

      if date_fields.any?(&:zero?) || !Date.valid_date?(*date_fields)
        return nil
      end

      if hour.blank? && minute.blank?
        Date.new(*date_fields)
      else
        args = date_fields + time_fields
        Time.zone ? Time.zone.local(*args) :
          Time.new(*args)
      end
    end
  end

  # this hooks into the format-specific #deserialize! method.
  def deserialize!(params)
    super DateTimeParamsFilter.new.call(params) # if params.is_a?(Hash) # this currently works for hash, only.
  end
end

Version data entries

12 entries across 12 versions & 2 rubygems

Version Path
reform-rails-0.2.6 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.5 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.4 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.3 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.2 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.1 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.0 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.0.rc3 lib/reform/form/multi_parameter_attributes.rb
ajax_error_renderer-0.3.0 app/views/ajax_errors/multi_parameter_attributes.rb
ajax_error_renderer-0.2.0 app/views/ajax_errors/multi_parameter_attributes.rb
reform-rails-0.2.0.rc2 lib/reform/form/multi_parameter_attributes.rb
reform-rails-0.2.0.rc1 lib/reform/form/multi_parameter_attributes.rb