ruby-on-rails - rails : Manipulating a Join Table in a Nested Form

标签 ruby-on-rails nested-forms jointable

我有两个由连接表连接的模型:

class Publication < ActiveRecord::Base
  attr_accessible :title, :author_attributes, :translator_attributes

  has_many :publication_contributors
  has_many :authors, :through => :publication_contributors, :source => :contributor,
    :conditions => {:publication_contributors => {:contributor_type => "Author"}}
  has_many :translators, :through => :publication_contributors, :source => :contributor,
    :conditions => {:publication_contributors => {:contributor_type => "Translator"}}

  accepts_nested_attributes_for :authors, :translators
end

class Contributor < ActiveRecord::Base
  attr_accessible :name

  has_many :publications, :through => :publication_contributors
  has_many :publication_contributors
end

class PublicationContributor < ActiveRecord::Base
  attr_accessible :contributor_type

  belongs_to :publication
  belongs_to :contributor
end

请注意,连接表具有第三个属性(除了publication_id 和contributor_id),称为contributor_type。此属性可能包含诸如“作者”、“翻译者”、“编辑者”或其他角色之类的角色。在我的发布模型中,我为两个更常见的贡献者类型“作者”和“翻译者”创建了一对关联。这些关联在检索相关数据方面效果很好,例如使用 @publication.authors .然而,当通过嵌套表单创建这些关联时,它会出错。

我的表格看起来像这样:
<%= form_for @publication, :remote => true do |f| %>

  <%= f.label :title %>:
  <%= f.text_field :title %>

  <%= f.fields_for :authors do |builder| %>
    <%= builder.label :name, "Author" %>:
    <%= builder.text_field :name %>
  <% end %>

  <%= f.fields_for :translators do |builder| %>
    <%= builder.label :name, "Translator" %>:
    <%= builder.text_field :name %>
  <% end %>

  <%= f.submit %>
<% end %>

在我的 Controller 中:
def create
  publication = Publication.create(params[:publication])
end

表单按预期呈现,但在创建操作期间会出现问题。我曾希望 Rails 知道根据发布关联中的条件神奇地分配正确的贡献者类型,例如:
has_many :authors, :through => :publication_contributors, :source => :contributor,
:conditions => {:publication_contributors => {:contributor_type => "Author"}}

不幸的是,事实并非如此。我在创建过程中收到此错误:
Mysql2::Error: Column 'contributor_type' cannot be null

这让我觉得我唯一的办法就是在 before_create 中手动分配contributor_type回调,但如果是这种情况,我如何确定要分配的类型?参数在其名称中具有正确的类型,例如:
publication[authors_attributes][0][name]

有什么方法可以访问模型层中的信息吗?

更新:

我的 new行动:
def new
  @publication = Publication.new
  publication_contributor = @publication.publication_contributors.build
  contributor = publication_contributor.contributor.build
end

它在最后一行抛出此错误(一个设置 contributor ):
undefined method `build' for nil:NilClass

最佳答案

您可以尝试以下方法吗?

class Publication < ActiveRecord::Base
  attr_accessible :title, :publication_contributors_attributes

  has_many :publication_contributors
  has_many :authors, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Author' } }
  has_many :translators, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Translator' } }

  accepts_nested_attributes_for :publication_contributors
end

class Contributor < ActiveRecord::Base
  attr_accessible :name

  has_many :publications, through: :publication_contributors
  has_many :publication_contributors
end

class PublicationContributor < ActiveRecord::Base
  attr_accessible :contributor_type

  belongs_to :publication
  belongs_to :contributor

  accepts_nested_attributes_for :contributor
end

<%= form_for @publication, :remote => true do |f| %>

  <%= f.label :title %>:
  <%= f.text_field :title %>

  <%= f.fields_for :publication_contributors do |pc_form| %>
    <%= pc_form.hidden_field :contributor_type %>
    <%= pc_form.fields_for :contributor do |c_form| %>
      <%= c_form.label :name, "Author" %>:
      <%= c_form.text_field :name %>
    <% end %>
  <% end %>

  <%= f.submit %>
<% end %>

更新: Controller 代码
@publication.publication_contributors.build
@publication.publication_contributors.each do |pc|
  pc.build_contributor
end

关于ruby-on-rails - rails : Manipulating a Join Table in a Nested Form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14699226/

相关文章:

join - Doctrine 2 连接表 + 额外字段

ruby-on-rails - Dokku + Rails + Postgresql 错误 - URI::InvalidURIError:方案 postgres 不接受注册表部分:root

ruby-on-rails - 使用 `rails server` 和 `rackup` 有什么区别?

ruby-on-rails - Rails 和 Paperclip Errno::EACCES 权限被拒绝

jquery - RoR 教程 Michael Hartl 删除微帖子也会删除用户

ruby-on-rails - Rails 使用嵌套表单和回形针 gem 不允许的参数

ruby-on-rails-3 - 使用带有空关联的nested_form gem 时出错

ruby-on-rails - 在 click rails 上再添加一组相同的输入

ruby-on-rails - Rails 3 - 创建新的 HABTM 关联时连接表未更新

ruby-on-rails - 为什么 Rails 4 中的连接表会出现未知主键异常?