我有两种模式:会议和会谈。会议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错误,我该如何解决?
答案 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