Ruby on Rails Sunday, May 2, 2010

Hi,

I've been struggling with getting accepts_nested_attributes_for to work
perfectly with a nested model form. This is a project that was started
before Rails 2.0, and I'm trying to use new techniques in the new
functionality. I'm presently using Rails 2.3.4. I'm down to one last
issue, and I'm not finding an answer so far.

The system I'm building deals with Items that have ResponseItem's as
children (think questions with multiple choices). Creating a new item
works fine. By default, the item has 12 potential responses. A form is
rendered that allows the user to enter up to 12 responses. The saving
of the new item works fine.

The issue is with editing. Say the item was created with 4 responses.
When the edit form is rendered, 4 of the responses are shown, and the
other 8 are blank (only the first 4 are representing objects in the
databases, the blank ones have no database records). When the form is
submitted, I'm receiving an HTTP 500 error, with this output in the log:

Completed in 176ms (View: 95, DB: 22) | 200 OK
[http://localhost/items/edit/648?assessment_id=1]
/!\ FAILSAFE /!\ Sun May 02 21:04:01 UTC 2010
Status: 500 Internal Server Error
expected Array (got Hash) for param `response_items_attributes'
/opt/jruby-1.4.0/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/utils.rb:85:in
`normalize_params'
/opt/jruby-1.4.0/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/utils.rb:94:in
`normalize_params'
/opt/jruby-1.4.0/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/utils.rb:62:in
`parse_nested_query'
/opt/jruby-1.4.0/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/utils.rb:60:in
`each'
/opt/jruby-1.4.0/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/utils.rb:60:in
`parse_nested_query'
/opt/jruby-1.4.0/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/request.rb:140:in
`POST'
....

The call stack does not even show my code, it's all framework so far.

The models look like this:

class Item < ActiveRecord::base
...
attr_accessor :response_item_ids
has_many :response_items
accepts_nested_attributes_for :response_items, :allow_destroy => true,
:reject_if => proc { |attributes| attributes['Response'].blank? }
...
end

class ResponseItem < ActiveRecord::base
...
belongs_to :item
...
end

The only real clue so far, is the names of the fields on the edit form
are different whether it's a pre-filled response, or a blank one.

This is for a response that has an item in the database:
<td>
<input id="item_response_items_attributes_1311_Response"
name="item[response_items_attributes][1311][Response]" size="30"
type="text" value="Very familiar - I could explain common
product/service offerings" />
</td>

This is for a blank response item, with no object in the database:
<td>
<input id="item_response_items_attributes__Response"
name="item[response_items_attributes][][Response]" size="30" type="text"
/>
</td>

My hunch is that mixing a form with some items that have an ID, and some
that are blank for an ID, is potentially causing trouble in the
normalize_params function?

One possible solution could be that for blank responses, I create a
temporary database item, so that they have an ID field filled out. When
I try to edit an item with all 12 responses, it does work because
there's an ID field for each response.

Clear as mud? :) Tough to explain this in a forum. If anyone has any
thoughts, I'd appreciate it.

Thanks,
Kevin
--
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+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

No comments:

Post a Comment