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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With