如何向添加人员表单中的人员添加地址?

问题描述:

我有一个(rails 3/jquery)应用程序,用户遇到一个新的人形式。在表格中,他可以做的其中一件事就是在构建人员时添加地址。我想要添加和显示地址(通过Ajax或页面本身),但地址只应在人员保存后提交(如果用户取消创建人员,地址也不应保存)。人员表格包含人员姓名字段和添加地址的按钮。点击添加地址后,弹出一个对话框输入地址。随着每个地址的添加,它会与表格一起显示。如何向添加人员表单中的人员添加地址?

这样做的最好方法是什么?我目前在使用jquery输入地址的人中填充div: <%= form_tag ... do%> <%= text_field_tag:person_name%> <%= link_to'Add address',nil,:id = > 'add_address_link',:远程=>真%>
<%= submit_tag%> <%端%> $( '#add_address_link')上单击(函数(){ $('#。地址')。append(...); });
我可以处理提交,并将地址元素读入一系列隐藏字段(此处未显示),或者使用ajax而不是直接的jQuery点击处理程序,并将隐藏字段填充到erb中。不确定实现此目标的最佳方式是什么?

感谢 阿南德

导轨3支持与fields_for形式辅助嵌套形式。检查出http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object

你应该表现出的模型关联你的问题,但我会假设你有:

class Person < ActiveRecord::Base 
    has_many :addresses 
end 

class Address < ActiveRecord::Base 
    belongs_to :person 
end 

现在,要动态地添加重复字段为每个地址。虽然我不认为ryanb的nested_form宝石是必要的,你应该看他railscast http://railscasts.com/episodes/197-nested-model-form-part-2

的railscast演示动态地添加一行到一个表,其中每一行都是使用fields_for

嵌套形式有一个伴侣项目在github上,包括代码来做到这一点。

最后,你想调整ryanb的代码来使用隐藏的字段,而不是表行。我其实正在做这件事。

另一种选择是重构您的表单工作流程。我有另一个用例,这听起来更像你所描述的,对我来说最简单的事情是,使用相同的_form部分Person,只显示子对象(在你的案例中的地址),如果有的话。当然,在“新”动作中,没有(除非你在Person回调中做了某些事情)。然后,在Person“创建”操作中,而不是重定向到Person索引页面(典型),重定向到edit_person_path。然后,您可以使用remote/ajax向该人员添加地址,因为该人员将存在。

我假设你有一个单独的模型 - 地址。在这种情况下,只需将用于创建新用户的参数传递给地址控制器,并在地址控制器的create操作中,仅当存在具有参数的人员(如果Person.find成功)时才调用@address.save

+0

我第一次创建地址时,该人还不存在。我将如何看到页面上的第一个地址,同时添加更多地址(当人员尚未保存时)? – Anand

你的数据库是什么样的?如果人员和地址是单独的表格,我会推荐使用Ryanb的nested_form gem。 gem使用jQuery,并且使添加动态嵌套表单变得非常简单和快速。宝石支持has_many关系,所以你可以允许一个人拥有多个地址。

https://github.com/ryanb/nested_form