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@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to