如何在 Rails 上的 new(view) 中复制模型实例

How to duplicate model instance in new(view) on Rails

提问人:Vyacheslav Odinokov 提问时间:5/18/2023 更新时间:5/19/2023 访问量:39

问:

例如,我们有以下模型字段: -名字。 -姓。 -生日。 -地址。

如何在一页中复制表单,为每个人填写数据并一次创建多个记录。

<form>
    <input name />
    <input surname />
    <input birthdate />
    <input address />
</form>

<button>Additional+</button>

<button>Submit</button>

逻辑是当用户单击按钮时,呈现第二种形式。 每次点击都会呈现另一个奖励形式。Additional+

<form>
    <input name />
    <input surname />
    <input birthdate />
    <input address />
</form>

<form>
    <input name />
    <input surname />
    <input birthdate />
    <input address />
</form>

<form>
    <input name />
    <input surname />
    <input birthdate />
    <input address />
</form>

<button>Additional+</button>

<button>Submit</button>

当用户点击时,需要将整个数据发送到我的控制器。Submit

Ruby-on-Rails 表格

评论

0赞 Arctodus 5/18/2023
这需要 javascript,因此取决于您的 JS 设置。相关 1 相关 2
0赞 smathy 5/18/2023
Rails 没有一个功能可以做到这一点,你要求的是大量的代码,实际上你应该在网上寻找一个教程来完成这个过程。投票决定关闭。

答:

1赞 Les Nightingill 5/19/2023 #1

您只能有一个表单,即使要创建多个人也是如此。因此,您的表单将如下所示:

<%= form_for :person, url: person_index_path, method: 'post', id: 'form' do |f| %>
  <div id='new_persons'>
    <input name="persons[][first_name]">
  </div>
<%= f.submit 'Save names' %>
<% end %>
<button id="add">Add a person</button>

请注意文本输入字段的字段名称中的括号...这是能够将多个人作为一个数组提交的关键。[]

接下来,定义一个模板,该模板将用于添加其他人员:

<template id='tmpl'>
  <input name="persons[][first_name]">
</template>

接下来,您需要能够为其他人员添加其他字段,这是通过 javascript 完成的:

<script type='text/javascript'>
  const add_button = document.getElementById('add')
  const container = document.getElementById('new_persons')
  const person = document.getElementById('tmpl')

  add_field = ()=>{
    const new_person = person.content.cloneNode(true)
    container.appendChild(new_person)
  }

  add_button.addEventListener("click", add_field);
</script>

因此,每次单击“添加人员”按钮时,表单中都会添加另一个first_name字段。

当您单击“保存名称”时,您将提交带有参数哈希的表单,该哈希具有first_names数组,如下所示:

"persons"=>[{"first_name"=>"John"}, {"first_name"=>"Paul"}, {"first_name"=>"George"}, {"first_name"=>"Ringo"}]

在控制器中,您可以为接收到的数组的每个成员创建一个新人!