我有两个模型,链接和标签,通过第三个link_tags关联。以下代码位于我的链接模型中。
社团:
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操作:
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
查看来自new.html.erb的代码:
<% form_for [current_user, @link], :url => account_links_path do |f| %>
<%= render :partial => "form", :locals => { :f => f } %>
<% end %>
和相应的部分:
<%= 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>
以下代码行在Link控制器的create action中引发错误:
@link = @current_user.links.build(params[:link])
错误:Tag(#-621698598) expected, got Array(#-609734898)
has_many =&gt;是否还需要其他步骤? :通过案例?这些似乎是基本has_many案例的唯一指示变化。
答案 0 :(得分:8)
看一下你的代码行
<% f.fields_for :tags_attributes do |tag_form| %>
您只需使用:tags
代替:tags_attributes
。
这将解决您的问题
确保您已在控制器中构建链接和标签,例如
def new
@link = @current_user.links.build
@link.tags.build
end
答案 1 :(得分:5)
我在stackoverflow上找到了这个:
Rails nested form with has_many :through, how to edit attributes of join model?
请告诉我它是否有效。
答案 2 :(得分:2)
为了使其正常工作,您需要传入正确的参数哈希:
params = {
:link => {
:tags_attributes => [
{:tag_one_attr => ...}, {:tag_two_attr => ...}
],
:link_attr => ...
}
}
你的控制器看起来像:
def create
@link = Link.create(params[:link]) # this will automatically build the rest for your
end
答案 3 :(得分:1)
试试这个:
<% f.fields_for :tags_attributes do |tag_form| %>
答案 4 :(得分:0)
在新操作的控制器中(部分加载表单),您是否通过链接构建@tag?
所以你应该看到以下内容:
@link = Link.new
@tag = @link.tags.build
最好发布新的内容并创建links_controller的动作。
答案 5 :(得分:0)
试
<% f.fields_for :tags do |tag_form| %>
(即丢失_attributes in:tag_attributes)这就是我通常做嵌套表单的方法
答案 6 :(得分:0)
您需要在控制器或视图中构建标记
def new
@link = @current_user.links.build
@link.tags.build
end
#in your view you can just use the association name
<% f.fields_for :tags do |tag_form| %>