使用accepts_nested_attributes_for保存嵌套属性数组



项目与任务是一对多关系,项目accepts_nested_attributes_for :tasks .

在表单中,我的任务对象看起来像:

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

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

参数:{"use utf8"=>"✓"、"authenticity_token "=>"...=","项目"=>{"id"=>"1","任务"=>{"1"=>{"assigned_time"=>"9","due_time"=>"17点"},"2"=>{"assigned_time"=>"9","due_time"=>"17点"}}

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

project = Project.find(params[:id])
respond_to do |format|
  if project.update_attributes(params[:tasks])

但是我得到:

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

ActiveRecord::AssociationTypeMismatch (Task(#2188181260) expected, got数组(# 2151973780)):

有什么办法解决这个问题吗?

在您的Projects模型中,accepts_nested_attributes_for :tasks。如果你有has_many :tasks关联,这将定义@project.tasks_attributes=;如果你有has_one :task关联,这将定义@project.task_attributes=

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

= 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

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

attr_accessible :tasks_attributes, ...

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

相关内容

  • 没有找到相关文章

最新更新