Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

accepts_nested_attributes_for with has_many => :through Options

I have two models, links and tags, associated through a third, link_tags. The following code is in my Link model.

Associations:

class Link < ActiveRecord::Base   has_many :tags, :through => :link_tags   has_many :link_tags    accepts_nested_attributes_for :tags, :allow_destroy => :false,    :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } end  class Tag < ActiveRecord::Base   has_many :links, :through => :link_tags   has_many :link_tags end  class LinkTag < ActiveRecord::Base   belongs_to :link   belongs_to :tag end 

links_controller Actions:

  def new     @link = @current_user.links.build     respond_to do |format|       format.html # new.html.erb       format.xml  { render :xml => @link }     end   end    def create     @link = @current_user.links.build(params[:link])      respond_to do |format|       if @link.save         flash[:notice] = 'Link was successfully created.'         format.html { redirect_to links_path }         format.xml  { render :xml => @link, :status => :created, :location => @link }       else         format.html { render :action => "new" }         format.xml  { render :xml => @link.errors, :status => :unprocessable_entity }       end     end   end 

View code from new.html.erb:

<% form_for [current_user, @link], :url => account_links_path do |f| %> <%= render :partial => "form", :locals => { :f => f } %> <% end %> 

And the corresponding partial:

  <%= f.error_messages %>    <p>     <%= f.label :uri %><br />     <%= f.text_field :uri %>   </p>   <p>     <%= f.label :title %><br />     <%= f.text_field :title %>   </p>    <h2>Tags</h2>   <% f.fields_for :tags_attributes do |tag_form| %>   <p>     <%= tag_form.label :name, 'Tag:' %>     <%= tag_form.text_field :name %>   </p>   <% unless tag_form.object.nil? || tag_form.object.new_record? %>   <p>     <%= tag_form.label :_delete, 'Remove:' %>     <%= tag_form.check_box :_delete %>   </p>   <% end %>   <% end %>    <p>     <%= f.submit 'Update' %>   </p> 

The following line of code, in the create action in the Link controller throws an error:

@link = @current_user.links.build(params[:link]) 

The error: Tag(#-621698598) expected, got Array(#-609734898)

Are there additional steps needed in the has_many => :through case? These seem to be the only indicated changes for the basic has_many case.

like image 874
Andrew C Avatar asked Feb 06 '10 09:02

Andrew C


1 Answers

Take a look at the line of your code

<% f.fields_for :tags_attributes do |tag_form| %> 

You need to use just :tags instead of :tags_attributes. This will solve your issue

Make sure that You have build links and tags in your controller like

def new   @link = @current_user.links.build   @link.tags.build end 
like image 102
Jyothu Avatar answered Sep 21 '22 19:09

Jyothu