两种形式具有相同的动作

时间:2009-01-06 07:08:00

标签: html ruby-on-rails forms

我的rails应用程序中有两个表单。它们都存在于单独的选项卡中,当我提交一个表单时,我希望保存另一个表单中的数据。我该怎么办?或者有更好的方法来做这个而不是使用两个单独的形式?有没有更好的方法将长格式分散到多个标签中,当我按下提交时,所有标签中的所有数据都应该达到我的操作。感谢。

3 个答案:

答案 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])

这是为了更新,但你可以在那里做任何你想做的事。