2

我有以下模型类:

class Movie < ActiveRecord::Base
  has_and_belongs_to_many :actors
  accepts_nested_attributes_for :actors, :allow_destroy => true
  ...
end

class Actor < ActiveRecord::Base
  has_and_belongs_to_many :movies
  ...
end

movies/_form.html.haml 视图包含演员的嵌套表单:

...
= form_for @movie do |movie_form|
  = movie_form.fields_for :actors do |actor_form|
    = actor_form.text_field :id, "Id"
    = link_to_remove_fields "remove", actor_form
  = link_to_add_fields movie_form :actors
...
  = movie_form.submit 'Save'

link_to_remove_fields并且link_to_add_fields是执行 javascript 调用、为新参与者添加新字段或删除参与者的辅助方法。

控制器:

   class MovieController < ApplicationController

     #POST form
     def create
       @movie = Movie.new(params[:movie])
       ...
     end

     #GET nearly empty form with one field for actor
     def new
       @movie = Movie.new
       1.times {@movie.actors.build}

       respond_to do |format|
         format.html
         format.json { render json: @movie }
       end
     end
   end

问题:当按下“保存”(例如,只有一个 id=718 的参与者)并提交表单@movie = Movie.new(params[:movie])时,控制器的行会抛出以下错误:

无法为 ID= 的电影找到 ID=718 的演员

我确定 Actor 数据库中有 id=718 的实体。

4

2 回答 2

2

如果您试图将现有演员与新电影相关联,最简单的事情就是根本不使用accepts_nested_attributes

您从演员关联中获得的一件事是 a actor_ids,它返回关联演员的 id,或者允许您设置关联演员的列表。

要通过 rails 表单提交数组,输入的名称必须以 [] 结尾,例如,如果您有一个名称movie[actor_ids][]和值为 1 的输入,那么您将得到

{'movie' => {'actor_ids' => ['1']}}

在您的控制器中。如果您想提交第二个演员,只需创建另一个具有相同名称的输入movie[actor_ids][]。您也可以使用带有multiple属性集的选择框,但它们对用户来说可能有点不友好,尤其是当有多个选项可供选择时。

于 2013-05-14T13:51:54.180 回答
1

不幸的是,您不能使用accepts_nested_attributes_forwith has_and_belongs_to_many(例如,请参阅尝试使用 accept_nested_attributes_for 和 has_and_belongs_to_many 但未填充连接表)。不过,您可能可以使用has_many :x through: :ys 网络构建类似的东西。

于 2013-05-14T12:28:42.060 回答