使用simple_form

时间:2016-11-10 09:58:26

标签: ruby-on-rails simple-form nested-forms

是否可以使用其他对象的数据预填充simple_fields_for输入?

我有一个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字段,是否可能?我试着这样做:

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

以及我在UsersController中的内容:

@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 %>

没有显示任何内容。

1 个答案:

答案 0 :(得分:0)

好的,所以,似乎没有保存克隆,因此,使用它预填充simple_fields_for只会导致预填充直接属性,而且没有任何嵌套模型,因此,你是&#39;我必须保存克隆,从请求参数中删除其属性,并单独创建

@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

通过这种方式,您将拥有新用户,并且您的表单将预先填充背包属性和嵌套属性。