项目和任务具有一对多关系,项目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)):
任何想法如何解决这个问题?
答案 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方法,而不是任务(比如你的哈希)