强参数不允许使用json创建嵌套属性。 ActiveRecord :: AssociationTypeMismatch错误

时间:2014-03-19 21:44:54

标签: ruby-on-rails ruby json activerecord ruby-on-rails-4

我有两种模式:会议和会谈。会议has_many会谈和

accepts_nested_attributes_for :talks, :allow_destroy => true

Params我发布的内容如下:

{"id"=>"2", "name"=>"rails4444", "tags"=>"ruby, rails, backbone, javascript", "date"=>"2014-02-22", "organizer"=>"BackboneMeetupGroup", "description"=>"conference with cool speakers", "talks"=>{"title"=>"fdsf", "video_url"=>"fdsf"}, 

我在那里设置会话应该在数据库中创建。

我的HTML看起来像这样:

<input type="text" name="talks[title]" placeholder="Talk Title" />
<input type="text" name="talks[video_url]" placeholder="url" />

当我通过谈话更新我的会议模型时,它给了我一个错误:

ActiveRecord :: AssociationTypeMismatch(谈话(#70154003251480)预期,得到阵列(#70154000241560)):   app / controllers / meetings_controller.rb:25:在`update&#39;

我的控制器看起来像这样:

 def update
    @single = Conference.find params[:id]
    if @single.update_attributes conference_params
      render "conferences/show"
    else
      respond_with @single
    end
  end



  def conference_params
    params.permit(:name, :tags, :date, :organizer, :description, :place, :talks => [:conference_id, :id, :title, :video_url])
  end

为什么我会收到ActiveRecord :: AssociationTypeMismatch错误,我该如何解决?

2 个答案:

答案 0 :(得分:2)

作为conference has_many talks,您需要一组会话作为嵌套属性,而不是单个属性。

您的输入字段需要如下名称:

<input type="text" name="conference[talks_attributes][0][title]" />

accepts_nested_attributes合作。创建这些输入的常规方法是使用

<%= fields_for :talks do |ff| %>
  <%= ff.text_field :title %>
<% end %>

请参阅Rails Guide on form helpers

您需要在talks_attributes中使用permit作为medBo建议。

答案 1 :(得分:1)

在您的conference_params方法中,只需将_attributes添加到talks符号,例如此talks_attributes,这样您的方法即可:

def conference_params
  params.permit(:name, :tags, :date, :organizer, :description, :place, :talks_attributes =>  [:conference_id, :id, :title, :video_url])
end