我有一个(rails 3 / jquery)应用程序,用户遇到一个新的人员表单。在表单中,他可以做的一件事就是在构建人员时添加地址。我希望添加和显示地址(通过Ajax或在页面本身上),但只有在保存人员时才应提交地址(如果用户取消创建人员,则也不应保存地址) )。人员表单包含人名的字段和添加地址的按钮。点击添加地址后,会弹出一个对话框输入地址。随着每个地址的添加,它将与表单一起显示。
最好的方法是什么?我目前在使用jquery输入地址的人员中填充div:
<%= form_tag ... do%>
<%= text_field_tag:person_name%>
<%= link_to'添加地址',nil,:id => 'add_address_link',:remote =>真%GT;
<%= submit_tag%>
<%端%GT;
$( '#add_address_link')。点击(函数(){
$( '#地址')追加(...)。
});
我可以处理提交,并将地址元素读入一系列隐藏字段(此处未显示),或使用ajax而不是直接jquery点击处理程序,并填充erb中的隐藏字段。不确定实现这一目标的最佳方法是什么?
由于 阿南德
答案 0 :(得分:1)
您的数据库是什么样的?如果人员和地址是单独的表,我建议使用Ryanb的nested_form gem。 gem使用jQuery,可以非常轻松快速地添加动态嵌套表单。 gem支持has_many关系,因此您可以允许一个人拥有多个地址。
答案 1 :(得分:1)
Rails 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 gem是必要的,但你应该看看他的railscast http://railscasts.com/episodes/197-nested-model-form-part-2
railscast演示了如何使用fields_for
向表中动态添加行,其中每行都是嵌套表单github上有一个配套项目,其中包含执行此操作的代码。
最后,您希望调整ryanb的代码以使用隐藏字段而不是表行。我实际上正在做这件事。
另一种选择是重组表单工作流程。我有另一个用例,听起来更像你所描述的内容,对我来说最简单的事情是,对Person使用相同的_form partial,只显示子对象(在你的情况下为Address)。当然,在“新”动作中,没有(除非你在Person回调中做了一些事情)。然后,在Person“create”操作上,而不是重定向到Person索引页面(典型),重定向回edit_person_path。然后,您可以使用remote / ajax向该人添加地址,因为此人将存在。
答案 2 :(得分:0)
我假设你有一个单独的模型 - 地址。在这种情况下,只需将用于创建新用户的参数传递给地址控制器,并在地址控制器的create
操作中,仅当具有参数的人员存在时调用@address.save
(如果是人员) .find很成功)。