2009-01-06 83 views
2

我在我的Rails应用程序中有两种形式。它们都存在于单独的选项卡中,当我提交一个表单时,我希望另一个表单中的数据也被保存。我应该怎么做?或者有没有更好的方法来做到这一点,而不是使用两个单独的表单?是否有更好的方式将长表单分散到多个选项卡中,并且当我按下提交所有选项卡中的所有数据时应该达到我的操作。谢谢。两种形式具有相同的动作

回答

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

我无法测试,如果这个概念作品的权利,但我相信,你可以使用jQuery实现这一目标,其提交功能将拦截任何选项卡上的所有表单提交,东西沿着这些线路

$("form").submit(function(event){ 
    event.preventDefault(); 
    //serialize forms here and submit using jquery post 
}); 
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]) 

这是一个更新,但你可以做任何你在那里想。