Ruby on rails 在RubyonRails4中同时提交两个表单

Ruby on rails 在RubyonRails4中同时提交两个表单,ruby-on-rails,Ruby On Rails,我们正在RubyonRails中进行性能管理项目,我们已经创建了两个表单,目标表和属性表,我们希望下一步按钮显示在目标表表单中 当我们点击它时,它的所有数据将保存在数据库中并显示属性表表单&填写属性表表单后,当我们点击提交按钮时,目标表和属性表表单的所有数据将一起显示为显示页面,必须注意的是,浏览器一次只能发送一个表单,因为它们是同步的。(参见下面关于AJAX的注释) HTML不允许设计嵌套表单,因为它会过于复杂并导致许多歧义 相反,您可以做的是创建一个表单,其中包含多个资源的数据 您可能已经注

我们正在RubyonRails中进行性能管理项目,我们已经创建了两个表单,目标表和属性表,我们希望下一步按钮显示在目标表表单中


当我们点击它时,它的所有数据将保存在数据库中并显示属性表表单&填写属性表表单后,当我们点击提交按钮时,目标表和属性表表单的所有数据将一起显示为显示页面,必须注意的是,浏览器一次只能发送一个表单,因为它们是同步的。(参见下面关于AJAX的注释)

HTML不允许设计嵌套表单,因为它会过于复杂并导致许多歧义

相反,您可以做的是创建一个表单,其中包含多个资源的数据

您可能已经注意到,Rails和大多数其他框架一样,使用特殊格式的名称属性从表单数据创建哈希和数组

例如:

<input name="user[name]" type="text" value="John Doe">
<input name="user[age]" type="number" value="45">
通常,当您为使用
form_时,您会将表单绑定到单个对象。这将在参数中提供一个根键

如果出于某种原因希望提交两个不相关的对象,可以手动创建表单标记并使用

但在大多数情况下,您希望与一起使用来创建/编辑嵌套记录


那ajax呢? Ajax仍然不允许您同时发送多个表单。但它确实允许您将表单输入合并到单个请求中,或者向用户发送多个请求,这些请求看起来是一个表单提交


如果您正在构建像单页应用程序之类的东西,则应该考虑使用Ajax代替深嵌套的代码>它可以让您更好地构建应用程序,并为用户提供更好的即时反馈。

据我所知,您应该在一个控制器中对某个操作执行ajax post,然后从该操作返回一个对象,然后使用它填充第二个表单。另一方面,你应该在两个模型之间建立一个关系,并使用accepts\u nested\u attributes\u作为两个相关对象的一种形式的子文件?如果是这样,您可能需要一个嵌套表单。
{
  "user" => {
    "name" => "John Doe",
    "age" => "45"
  }
}
<%= form_tag("/something") do %>
  <%= fields_for(@foo) do |ff| %>
    <%= ff.text_field :foo_attr %>
  <% end %>
  <%= fields_for(@foo) do |ff| %>
    <%= ff.text_field :bar_attr %>
  <% end %>
<% end %>
{
  "foo" => {
    "foo_attr" => "some value"
  },
  "bar" => {
    "bar_attr" => "some value"
  }
}
class Hotel
  has_many :rooms
  accepts_nested_attributes_for :rooms, reject_if: :all_blank?
end

class Room
  belongs_to :hotel
end
<%= form_for(@hotel) do |f| %>
  <%= f.text_field :name %>
  <fieldset>
     <legend>Rooms</legend>
     <%= fields_for(:rooms) do |r| %>
       <%= f.number_field :number, step: 1 %>
       <%= f.number_field :beds, step: 1 %>
     <% end %>
  </fieldset>
<% end %>
class HotelController

  # GET '/hotels/new'
  def new
    @hotel = Hotel.new
    # seeds the form with empty records that the user can fill in.
    3.times { @hotel.rooms.new } 
  end

  # GET '/hotels/:hotel_id/edit'
  def edit
    @hotel = Hotel.find(params[:id])
    3.times { @hotel.rooms.new } 
  end

  # POST '/hotels'
  def create
    @hotel = @hotel.create(hotel_params)
    respond_with(@hotel)
  end

  # PATCH|PUT '/hotels/:hotel_id'
  def update
    @hotel = Hotel.find(params[:id])
    @hotel.update(hotel_params)
    respond_with(@hotel)
  end

  private

    def hotel_params
      params.require(:hotel)
            .permit(:name, rooms_attributes: [:number, :beds])
    end
end