我有一个Rails 3.2 ajax表单,为酒店创建一个新的房间。新的Room ajax表单在Room索引页面上正常工作,但是一旦我在Hotel编辑页面上嵌入了新的Room ajax表单,表单就会正常提交而不使用Ajax。
要创建新的房间表单,请使用Hotel edit.html.erb页面上的以下链接:
<%#= link_to 'Add a Room', new_room_path(:hotel_id => @hotel.id), :remote => true, :class => 'new_room' %>
这会将以下表单部分加载到同一页面:
<%= form_for @room, :remote => true, :html => { :class => "remote-form" } do |f| %>
<%= f.text_field :number %>
<%= f.text_field :size %>
<% if(params.has_key?(:'hotel_id')) %>
<% @hotel_id = params[:hotel_id] %>
<%= f.hidden_field :hotel_id, :value => @hotel_id %>
<% else %>
<%= f.collection_select(:hotel_id, Hotel.all, :id, :name) %>
<% end %>
<%= f.submit "Add this room", :class => 'room_create' %>
<%= link_to 'Cancel', '#', :class => "room_cancel" %>
<% end %>
最后,我在create.js.erb(在rooms文件夹中)中有以下内容:
alert('Test creating a room');
var content = $('<%= escape_javascript(render(@room)) %>');
$("#room_list tbody").append(content);
没有执行create.js.erb并定期提交表单(非ajax),我终于到达了show.html.erb页面。
为什么表单在单位索引页面上正常工作,但在关联的酒店编辑页面上却没有?
答案 0 :(得分:2)
即使您设置:remote => true
,Rails也会生成form
标记。 浏览器不支持嵌套表单标记,并会导致无法预测的行为。
您应该在这里重新考虑视图架构。您可以在酒店表格外面找到房间的表格,也可以使用fields_for
和accepts_nested_attributes_for
来编辑儿童对象。
以下是有关如何使用嵌套属性的完整示例:Nested Attributes Examples。
答案 1 :(得分:1)
您无法在HTML格式的表单中嵌套表单。当您单击表单上的任何提交按钮时,即使它在另一个表单中,也只会正确提交最外面的表单。
您可以使用nested attributes将房间的属性直接添加到表单中,以便在提交整个表单时,所有房间都是...或者使用div和链接,而不是表单和提交按钮。