Complex forms and :index => nil issues

Hi - I’m trying to figure out how to group nested fields in the form
such that they all submit with a certain order. I followed the complex
forms railscast (#75 Complex Forms Part 3 - RailsCasts), but I’m trying to
submit a nested model with more than a single field.

<% fields_for ‘project[task_attributes][]’, task do |tf| %>

Name: <%= tf.text_field :name, :index => nil %>

Start: <%= tf.text_field :start, :index => nil %>

End: <%= tf.text_field :end, :index => nil %>

<% unless task.new_record? %>
<% tf.hidden_field :id, :index => nil %>
<% end %>

<% end -%>

When I submit, params looks strange and is completely disorganized:

{ “project” =>
{ “name” => “test”,
“task_attributes” => [{ “start” => “10:00” },
{ “start” => “12:00” },
{ “end” => “10:30”, “start” => “11:00” },
{ “end” => “11:30” },
{ “end” => “12:30”, “id” => “1” },
{ “id” => “2”, “name” => “mow lawn” },
{ “name” => “buy milk” },
{ “name” => “clean room” }] }}

If I ommit the :index => :nil, I get an error “conflicting types for
parameter containers. Expected an instance of Array but found an
instance of Hash” called on task_attribues. What I need is exactly that

  • a hash grouping each task by id with it’s attributes:
    { “task_attributes” =>
    { “1” => { “name” => ‘buy milk’,
    “start” => ‘10:00’,
    “end” => ‘10:30’ }
    “2” => {…}…}

I’m feeling like I’m missing something big here… Any help will be
great - thanks.

On 23 Feb 2009, at 15:57, sa 125 wrote:

                     { "id" => "2", "name" => "mow lawn" },

{ “1” => { “name” => ‘buy milk’,
“start” => ‘10:00’,
“end” => ‘10:30’ }
“2” => {…}…}

I’m guessing the problem here is new records ? the easiest way out of
here is to drop all the :index => nil, but if the record is new the
call fields_for …, :index => ‘something’

new records would then appear with that key in the task_attributes
hash (obviously make the index unique)

Fred

Frederick C. wrote:

On 23 Feb 2009, at 15:57, sa 125 wrote:

                     { "id" => "2", "name" => "mow lawn" },

{ “1” => { “name” => ‘buy milk’,
“start” => ‘10:00’,
“end” => ‘10:30’ }
“2” => {…}…}

I’m guessing the problem here is new records ? the easiest way out of
here is to drop all the :index => nil, but if the record is new the
call fields_for …, :index => ‘something’

new records would then appear with that key in the task_attributes
hash (obviously make the index unique)

Fred

I did as you proposed and seperated the new record from the edited one.
I get the hash I wanted indexed by id (for edit), but apparently rails
doesn’t like it and throws an error:

Conflicting types for parameter containers. Expected an instance of
Array but found an instance of Hash…

I read that rails 2.3 will handle nested models seamlessly with
accepts_nested_attributes_for inside the parent model
(Ruby on Rails 2.3 Release Notes — Ruby on Rails Guides).

Any idea when the final 2.3 is going to be released (currently in RC1)?