Hello,

We posted this message in GitHub a few weeks ago (
https://github.com/rails/rails/issues/16516), and Rafael Franca gently 
pointed us at this mailing list. He suggested that we open up the 
discussion to see if this feature request would be accepted or not. All 
suggestions are welcomed - especially regarding the implementation.

We have various :has_many associations in our application, but we want to 
move away from *accepts_nested_attributes* due to an increasingly large and 
complex domain and workflow model.  We want more control over how model 
attributes get updated and are willing to forfeit the convenience of 
accepts_nested_attributes.  Unfortunately, the *FormBuilder#fields_for* 
method doesn't play well with this design decision.  As per the 
documentation, it requires the parent model to respond to 
*"#{association}_attributes="*.  This seems unnecessarily restrictive.

In the example provided by the documentation 
(http://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-fields_for):

class Person
  def projects
    [@project1, @project2]
  end

  def projects_attributes=(attributes)
    # Process the attributes hash
  end
end

It would be possible to just inspect *projects* to realize that it is a 
collection and treat it the same as nested attributes.  The following 
snippet contains a one line change that appears to accomplish this (see 
SUGGESTED CODE, extracted from *lib/action_view/helpers/form_helper.rb*):

def fields_for(record_name, record_object = nil, fields_options = {}, &block)
  fields_options, record_object = record_object, nil if 
record_object.is_a?(Hash) && record_object.extractable_options?
  fields_options[:builder] ||= options[:builder]
  fields_options[:namespace] = options[:namespace]
  fields_options[:parent_builder] = self
  case record_name
  when String, Symbol
    # ORIGINAL CODE
    # if nested_attributes_association?(record_name)
    # END OF ORIGINAL CODE

    # SUGGESTED CODE
     if nested_attributes_association?(record_name) *|| 
record_object.respond_to?(:to_ary)*
    # END OF SUGGESTED CODE
      return fields_for_with_nested_attributes(record_name, record_object, 
fields_options, block)
    end
  else
    record_object = record_name.is_a?(Array) ? record_name.last : record_name
    record_name   = model_name_from_record_or_class(record_object).param_key
  end
#...

The suggested modification would yield a more flexible solution without 
coupling so tightly to nested attributes.  What do you think of the idea 
and of this specific solution? Rafael noted that this could break existing 
applications, but we fail to see under what scenarios that would happen. 
Thoughts?

Thank You.

Jacobo & Ed
Case Commons

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to