Rails嵌套表单与has_many:through,如何编辑连接模型的属性?

Rails嵌套表单与has_many:through,如何编辑连接模型的属性?

使用accepts_nested_attributes_for时如何编辑连接模型的属性?

我有3个模型:由连接器加入的主题和文章

class Topic < ActiveRecord::Base
  has_many :linkers
  has_many :articles, :through => :linkers, :foreign_key => :article_id
  accepts_nested_attributes_for :articlesendclass Article < ActiveRecord::Base
  has_many :linkers
  has_many :topics, :through => :linkers, :foreign_key => :topic_idendclass Linker < ActiveRecord::Base
  #this is the join model, has extra attributes like "relevance"
  belongs_to :topic
  belongs_to :articleend

所以当我在主题控制器的“新”动作中构建文章时......

@topic.articles.build

...并在topics / new.html.erb中创建嵌套表单...

<% form_for(@topic) do |topic_form| %>
  ...fields...  <% topic_form.fields_for :articles do |article_form| %>
    ...fields...

... Rails自动创建链接器,这很棒。 现在我的问题是:我的链接器模型还具有我希望能够通过“新主题”表单更改的属性。但是Rails自动创建的链接器除了topic_id和article_id之外,其所有属性都有nil值。如何将其他链接器属性的字段放入“新主题”表单中,这样它们就不会出现?


元芳怎么了
浏览 791回答 3
3回答

桃花长相依

想出答案。诀窍是:@topic.linkers.build.build_article构建链接器,然后为每个链接器构建文章。因此,在模型中:topic.rb需要accepts_nested_attributes_for :linkerslinker.rb需要accepts_nested_attributes_for :article然后在表格中:<%=&nbsp;form_for(@topic)&nbsp;do&nbsp;|topic_form|&nbsp;%> &nbsp;&nbsp;...fields...&nbsp;&nbsp;<%=&nbsp;topic_form.fields_for&nbsp;:linkers&nbsp;do&nbsp;|linker_form|&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;...linker&nbsp;fields...&nbsp;&nbsp;&nbsp;&nbsp;<%=&nbsp;linker_form.fields_for&nbsp;:article&nbsp;do&nbsp;|article_form|&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...article&nbsp;fields...

梵蒂冈之花

当Rails生成的表单提交给Rails时controller#action,params将具有与此类似的结构(添加了一些组成的属性):params&nbsp;=&nbsp;{ &nbsp;&nbsp;"topic"&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;"name"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;"Ruby&nbsp;on&nbsp;Rails'&nbsp;Nested&nbsp;Attributes", &nbsp;&nbsp;&nbsp;&nbsp;"linkers_attributes"&nbsp;&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"0"&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"is_active"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;false, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"article_attributes"&nbsp;&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"title"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;"Deeply&nbsp;Nested&nbsp;Attributes", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"description"&nbsp;=>&nbsp;"How&nbsp;Ruby&nbsp;on&nbsp;Rails&nbsp;implements&nbsp;nested&nbsp;attributes." &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}注意linkers_attributes实际上如何Hash使用String键进行零索引,而不是Array?嗯,这是因为发送到服务器的表单字段键如下所示:topic[name]topic[linkers_attributes][0][is_active]topic[linkers_attributes][0][article_attributes][title]创建记录现在很简单:TopicController&nbsp;<&nbsp;ApplicationController &nbsp;&nbsp;def&nbsp;create&nbsp;&nbsp;&nbsp;&nbsp;@topic&nbsp;=&nbsp;Topic.create!(params[:topic]) &nbsp;&nbsp;endend
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Ruby