masta Blasta
2012-Aug-07 14:07 UTC
Nested attributes from multiple models on form. Rails 2.3
I have two models term term_versions (build from acts_as_versioned) They are related but for all intents and purposes different models. ''term_versions'' has this association not available to ''term'': has_many :technical_definitions, :dependent => :destroy accepts_nested_attributes_for :technical_definitions, :allow_destroy => true When i create a new ''term'' i want to also allow for the creation of technical_definitions related to its versions, but i can''t find a good DRY way of doing it. The best form i''ve come up with looks something like this: <% form_for(@term, ..options, do |f| %> ... <% fields_for "version[technical_definitions_attributes][]", new_tech_def do |td_fields| %> .... <% end %> <% end %> The problems with the above are numerous. For one, it''s hackish and i can''t reuse that code. Second, it only somewhat works for 1 technical definition. If i try to give it a collection to work with it goes haywire. Third, if the model validations fail, and the form has to be reloaded, those fields are not preserved by the new action, and the browser loses state. I can get around this last one by adding even more hackish lines to my controller code. Working with Rails 2.3 means i don''t have the :namespace option on fields_for which would really help. Any suggestions fellow devs? -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
masta Blasta
2012-Aug-07 20:06 UTC
Re: Nested attributes from multiple models on form. Rails 2.3
masta Blasta wrote in post #1071551:> I have two models > term > term_versions (build from acts_as_versioned) > > They are related but for all intents and purposes different models. > > ''term_versions'' has this association not available to ''term'': > has_many :technical_definitions, :dependent => :destroy > accepts_nested_attributes_for :technical_definitions, :allow_destroy => > true > > When i create a new ''term'' i want to also allow for the creation of > technical_definitions related to its versions, but i can''t find a good > DRY way of doing it. > > The best form i''ve come up with looks something like this: > > <% form_for(@term, ..options, do |f| %> > ... > <% fields_for "version[technical_definitions_attributes][]", > new_tech_def do |td_fields| %> > .... > <% end %> > <% end %> > > The problems with the above are numerous. For one, it''s hackish and i > can''t reuse that code. Second, it only somewhat works for 1 technical > definition. If i try to give it a collection to work with it goes > haywire. Third, if the model validations fail, and the form has to be > reloaded, those fields are not preserved by the new action, and the > browser loses state. I can get around this last one by adding even more > hackish lines to my controller code. > > Working with Rails 2.3 means i don''t have the :namespace option on > fields_for which would really help. > > Any suggestions fellow devs?After 5 hours of dealing with this i finally solved it. Mostly a matter of trying to combine various guides form the web to fit my situation. The key component was setting up a two level fields_for <% form_for(@term, ..options, do |f| %> ... <% f.fields_for :version, @version do |version_fields| %> <% version_fields.fields_for :technical_definitions do |td_fields| %> ....td_fields.text_field <% end %> <% end %> <% end %> this set up the correct namespace of: term[version_attributes][technical_definitions_attributes] and THEN my term model gets attr_accessor :version_attributes and THEN the controller gets @term.version_attributes = processed(params[version_attributes]) -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.