提问人:Vyacheslav Odinokov 提问时间:5/18/2023 更新时间:5/19/2023 访问量:39
如何在 Rails 上的 new(view) 中复制模型实例
How to duplicate model instance in new(view) on Rails
问:
例如,我们有以下模型字段: -名字。 -姓。 -生日。 -地址。
如何在一页中复制表单,为每个人填写数据并一次创建多个记录。
<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
答:
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"}]
在控制器中,您可以为接收到的数组的每个成员创建一个新人!
下一个:Rails 重置密码链接问题
评论