2016-11-10 94 views
0

是否可以使用其他對象的數據預填充simple_fields_for輸入?使用simple_form預填充嵌套元素

我有一個User對象。 User HAS_ONE BackpackBackpack有許多PocketsPocket的has_many Items

在構建自己的狀態,我使用

<%= f.simple_fields_for :backpack do |backpack| %> 
     <%= render 'backpack', f:backpack %> 
    <% end %> 

現在,當我在users#new,整個窗體是空的。我想用另一個Backpack對象的數據初始化Backpack字段,有可能嗎?我試着這樣做:在我UsersController

<%= f.simple_fields_for :backpack, @backpack do |backpack| %> 
     <%= render 'backpack', f:backpack %> 
    <% end %> 
與此相伴

@user = User.new 
@backpack = Backpack.find(1).deep_clone include: [ :pockets, { pockets: :items } ] 

但這不起作用:由於某種原因,該Backpack字段填寫,但他Pockets及其Items是空的。我嘗試了幾乎所有想到的:檢查嵌套對象的路由,嘗試使用和不使用deep_cloning,仍然無法找到嵌套對象,這讓我想知道,是否可以初始化帶預填充嵌套的表單楷模?

編輯:

好了,由於某些原因,當我把一個

<% @backpack.pockets.each do |pocket| %> 
    <%= pocket.title %> 
<% end %> 

它顯示了所有的口袋冠軍,這意味着我成功地克隆了揹包,但是,使用這個:

<%= f.simple_fields_for :pockets, @backpack.pockets do |pocket| %> 
    <%= render 'pocket', f: pocket %> 
<% end %> 

什麼都不顯示。

回答

0

好的,因此,看起來克隆沒有保存,因此,使用它來預填充simple_fields_for只會導致預填充直接屬性,而沒有任何嵌套模型,因此,您必須保存克隆,從再審PARAMS刪除其屬性,並分別創建

@backpack = Backpack.find(1).deep_clone include: [ :pockets, { pockets: :items } ] 
@backpack.save 

,然後,在Users#create方法

@user = User.new(user_params.except(:backpack_attributes)) 
@backpack = Backpack.new(params[:user][:backpack]) 
@backpack.save 
@user.backpack = @backpack 

這樣,你就會有你的新用戶,您的表格將預充滿t他揹包屬性和嵌套屬性。