使用simple_form预填充嵌套元素

问题描述:

是否可以使用其他对象的数据预填充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 %> 

什么都不显示。

好的,因此,看起来克隆没有保存,因此,使用它来预填充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他背包属性和嵌套属性。