【发布时间】:2010-09-29 18:20:37
【问题描述】:
我的 rails 应用程序中有两个表单。它们都存在于单独的选项卡中,当我提交一个表单时,我希望也保存另一个表单中的数据。我该怎么做?或者有没有更好的方法来代替使用两个单独的表格?有没有更好的方法将长表单分散到多个选项卡中,当我按下提交时,所有选项卡中的所有数据都应该达到我的操作。谢谢。
【问题讨论】:
标签: html ruby-on-rails forms
我的 rails 应用程序中有两个表单。它们都存在于单独的选项卡中,当我提交一个表单时,我希望也保存另一个表单中的数据。我该怎么做?或者有没有更好的方法来代替使用两个单独的表格?有没有更好的方法将长表单分散到多个选项卡中,当我按下提交时,所有选项卡中的所有数据都应该达到我的操作。谢谢。
【问题讨论】:
标签: html ruby-on-rails forms
您可以扩展单个表单以涵盖两个表单的所有元素。
这完全没问题,只要表单标签有效地适合 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。
可能有更好的方法可以做到这一点,但我想不出任何办法。
【讨论】:
我现在无法测试这个概念是否有效,但我相信你可以使用 jQuery 来实现这一点,它的提交功能将拦截任何选项卡上的所有表单提交,类似于这些内容
$("form").submit(function(event){
event.preventDefault();
//serialize forms here and submit using jquery post
});
【讨论】:
您应该查看 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])
这是为了更新,但你可以在那里做任何你想做的事情。
【讨论】: