2011-05-01 85 views
0

項目嵌套屬性和任務有一個一對多的關係,以及項目accepts_nested_attributes_for:任務。保存陣列accepts_nested_attributes_for

在形式,我的任務對象的樣子:

項目[任務] [2] [assigned_time] 項目[任務] [2] [DUE_TIME]

當提交表單時,我得到hash:

參數:{「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" }}

然後我EXPEC只需保存項目對象即可保存它們: project = Project.find(params [:id])

respond_to do | format | 如果project.update_attributes(PARAMS [:任務])

,但我得到: 警告:不能大規模指派保護的屬性:id SQL(0.3ms的)ROLLBACK 在169ms

ActiveRecord的完成: :AssociationTypeMismatch(任務(#2188181260)預期,得到了陣列(#2151973780)):

任何想法如何解決這一問題?

回答

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 
2

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

attr_accessible :tasks_attributes, ... 

並且也注意到,這,也許你產生錯誤的形式,因爲在我當前的應用程序,表格嵌套屬性使用task_attributes方法,而不是任務(如你的散列)

+0

其實我不得不定義task_attributes =。我不完全理解它,但它工作。我很好奇,因爲如果有人知道 – 99miles 2011-05-01 17:58:54

+0

添加您的項目模型質疑的解釋,請 – crsde 2011-05-01 18:02:32

+0

attr_accessible在導軌4贊成強參數棄用 – 2017-09-25 22:01:41