Sha256: 483e7aac0c75671682b95fb7e82cb8089dde9232d39d17382ae111445bf947a1

Contents?: true

Size: 1.55 KB

Versions: 6

Compression:

Stored size: 1.55 KB

Contents

module Reform::Form::ActiveModel
  # Including FormBuilderMethods will allow using form instances with form_for, simple_form, etc.
  # in Rails. It will further try to translate Rails' suboptimal songs_attributes weirdness
  # back to normal `songs: ` naming in +#valiate+.
  module FormBuilderMethods
    def self.included(base)
      base.extend ClassMethods # ::model_name
    end

    module ClassMethods
    private

      # TODO: add that shit in Form#present, not by overriding ::property.
      def property(name, options={}, &block)
        super.tap do |definition|
          add_nested_attribute_compat(name) if definition[:twin] # TODO: fix that in Rails FB#1832 work.
        end
      end

      # The Rails FormBuilder "detects" nested attributes (which is what we want) by checking existance of a setter method.
      def add_nested_attribute_compat(name)
        define_method("#{name}_attributes=") {} # this is why i hate respond_to? in Rails.
      end
    end

    # Modify the incoming Rails params hash to be representable compliant.
    def deserialize!(params)
      # this only happens in a Hash environment. other engines have to overwrite this method.
      schema.each do |dfn|
        rename_nested_param_for!(params, dfn)
      end

      super(params)
    end

  private
    def rename_nested_param_for!(params, dfn)
      nested_name = "#{dfn.name}_attributes"
      return unless params.has_key?(nested_name)

      value = params["#{dfn.name}_attributes"]
      value = value.values if dfn[:collection]

      params[dfn.name] = value
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
reform-2.0.5 lib/reform/form/active_model/form_builder_methods.rb
reform-2.0.4 lib/reform/form/active_model/form_builder_methods.rb
reform-2.0.3 lib/reform/form/active_model/form_builder_methods.rb
reform-2.0.2 lib/reform/form/active_model/form_builder_methods.rb
reform-2.0.1 lib/reform/form/active_model/form_builder_methods.rb
reform-2.0.0 lib/reform/form/active_model/form_builder_methods.rb