使用accepts_nested_attributes_for保存嵌套属性数组

时间:2011-05-01 17:02:04

标签: ruby-on-rails ruby-on-rails-3

项目和任务具有一对多关系,项目accepts_nested_attributes_for :tasks

在表单中,我的任务对象如下所示:

project[tasks][2][assigned_time]
project[tasks][2][due_time]

提交表单时,我得到一个哈希:

  

参数:{“utf8”=>“✓”,“authenticity_token”=>“... =”,   “project”=> {“id”=>“1”,“tasks”=> {“1”=> {“assigned_time”=>“09:00”,   “due_time”=>“17:00”},“2”=> {“assigned_time”=>“09:00”,   “DUE_TIME”=> “中17:00”}}

然后我希望通过保存项目对象来保存它们:

project = Project.find(params[:id])

respond_to do |format|
  if project.update_attributes(params[:tasks])

但我明白了:

  

警告:无法批量分配受保护的属性:id SQL(0.3ms)   ROLLBACK在169ms完成

     

ActiveRecord :: AssociationTypeMismatch(任务(#2188181260)期待,得到   阵列(#2151973780)):

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

Projects模型中,accepts_nested_attributes_for :tasks。如果您有@project.tasks_attributes=关联,则会定义has_many :tasks;如果您有@project.task_attributes=关联,则定义为has_one :task

在您的表单中,以下内容:

= form_for @project do |f|
  = f.label :project_attribute
  = f.text_field :project_attribute

  = f.fields_for :tasks do |t|
    = t.label :task_attribute
    = t.text_field :task_attribute

在项目控制器中,以下内容:

def new
  @project = Project.new
  @project.tasks.build #=> if has_many
  @project.build_task  #=> if has_one
end

答案 1 :(得分:2)

我想,您只是忘记在项目模型中将task_attributes添加到attr_accessible列表中:

attr_accessible :tasks_attributes, ...

另外,请注意,也许你生成了错误的表单,因为在我当前的应用程序中,带有嵌套属性的表单使用task_attributes方法,而不是任务(比如你的哈希)