[Form Helpers] Collection_select multiple and accepts_nested_attributes_for

Hello, I'm triying to set a form but I'm having problems.These are my models:

class Post < ActiveRecord::Base   has_many :taggings, :dependent => :destroy   has_many :tags, :through => :taggings   accepts_nested_attributes_for :taggings, :limit => 3 end

class Tag < ActiveRecord::Base   has_many :taggings, :dependent => :destroy   has_many :posts, :through => :taggings end

class Tagging < ActiveRecord::Base   belongs_to :advert   belongs_to :tag end

In my view posts/_form.html.erb: <%= form_for @post do |f| %>   <%= f.fields_for :taggings do |t| %>     <% t.collection_select :tag_id, Tag.all, :id, :name, { :selected => @post.tag_ids }, { :multiple => true } %>   <% end %> <% end %>

The problem is that I want a MULTIPLE select control for this application but that seems incompatible with the accepts_nested_attributes_for is expected. This control return an array of options selected, like this: - One option selected ==> "post"=>{"taggings_attributes"=>{"0"=>{"tag_id"=>["1"]}}} - Two options selected ==> "post"=>{"taggings_attributes"=>{"0"=>{"tag_id"=>["1","2"]}}}

Instead, the accepts_nested_attributes_for is expected something like this: - One option selected ==> "post"=>{"taggings_attributes"=>{"0"=>{"tag_id"=>"1"}}} - Two options selected ==> "post"=>{"taggings_attributes"=>{"0"=>{"tag_id"=>"1"},"1"=>{"tag_id"=>"2"}}}

I'm already clouded with this. One solution is to use a collection_select control without multiple but I hope may have other better solution.

Thanks very much. Daniel.

Other solution is change the params hash for setup like accepts_nested_attributes_for is expecting. I don't know which is the best solution for do it. In short, I want to create multiple nested objects by selecting from a list.

How about using ryanb's nested_form gem? Should work well for your case.

-cpr

Thanks cpr. It isn't work for multiple select control but It's okey for a classic select.

Try this:

<%= collection_select(:taggings, :tag_ids, Tag.find(:all), :id, :name, {}, {:multiple => true}) %>