我的rails应用程序中有两个表单。它们都存在于单独的选项卡中,当我提交一个表单时,我希望保存另一个表单中的数据。我该怎么办?或者有更好的方法来做这个而不是使用两个单独的形式?有没有更好的方法将长格式分散到多个标签中,当我按下提交时,所有标签中的所有数据都应该达到我的操作。感谢。
答案 0 :(得分:5)
您可以展开单个表单以涵盖两个表单的所有元素。
这是完全正常的,只要表单标签有效地适合X / HTML。
<form action='action1'>
<!-- All elements from both forms, plus tabs, etc. -->
</form>
唯一要考虑的是,如果该区域内还有另一种形式需要转到另一个动作。例如,如果您在其他两个选项卡之间添加第三个选项卡,则会有不同的操作。
你不想最终像:
<form action='action1'>
<!-- elements from the combined forms -->
<form action='action2'>
<!-- elements for a totally different form, not valid inside another form -->
</form>
<!-- more elements from the combined forms -->
</form>
在这种情况下,最好在提交时使用JavaScript合并两个表单。
jQuery(jquery.com)会让这很容易。例如,您可以序列化两个表单,然后连接它们并通过post或get将结果发送到服务器。
见http://docs.jquery.com/Ajax/serialize。
可能有更好的方法可以做到这一点,但我无法想到任何问题。
答案 1 :(得分:1)
我无法测试这个概念现在是否正常工作,但我相信你可以使用jQuery来实现它,它的提交函数将拦截任何标签上的所有表单提交,这些都是这样的
$("form").submit(function(event){
event.preventDefault();
//serialize forms here and submit using jquery post
});
答案 2 :(得分:0)
您应该查看fields_for方法。你可以这样做:
<% form_for @house do |f| %>
<%= f.text_field :square_feet %>
<% fields_for @listing do |s| %>
<%= s.hidden_field :id %>
<%= s.text_field :asking_price %>
<% end %>
<%= f.submit %>
<% end %>
然后在你的控制器中你会做这样的事情:
house = House.find(params[:id])
house.update_attributes(params[:house])
listing = Listing.find(params[:listing][:id])
listing.update_attributes(params[:listing])
这是为了更新,但你可以在那里做任何你想做的事。