繁体   English   中英

用simple_form预填充嵌套元素

[英]Prefill a nested element with simple_form

是否可以使用来自另一个对象的数据来预填充simple_fields_for输入?

我有一个User对象。 User has_one BackpackBackpack有多个Pockets ,而Pocket 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 %>

它显示了所有的口袋标题,这意味着我使用以下命令成功克隆了背包BUT:

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

什么都没有显示。

好的,因此似乎没有保存克隆,因此,使用它来simple_fields_for只会导致预填充直接属性,并且没有嵌套模型,因此,您必须保存克隆,删除其克隆。属性来自请求参数,并分别创建

@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

这样,您将拥有新用户,并且您的表单将被背包属性和嵌套属性预填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM