表单提交按钮仅在重新加载后有效

我有一个构建表的索引页面,我试图允许用户编辑表中的行。 我试图以最基本的方式做到这一点 – 没有javascript,ajax等,除非Rails提供它。

我的表在index方法中显示正常,并且有一个表单作为表中的最后一行,可用于添加新行。 新表格工作正常。 每行都有一个编辑链接,可以路由到控制器的编辑方法。 控制器设置要编辑的对象,并使用要编辑的行中的表单呈现索引。 我的问题是这个表单不会提交,但如果我刷新页面就会提交。

页面将在刷新后提交的事实非常令人困惑。 我没有看到刷新会如何做什么不同然后点击链接(它应该仍然通过相同的路由,相同的变量对吗?)我看不清楚刷新前后的formshtml有什么区别。 有什么想法可能会发生什么?

我不确定甚至开始查看的代码是什么,但是这里有。

index.html.erb

...             ... 

_form_in_table.html.erb

            

_bom_in_table.html.erb

          

boms_controller.rb

 ... def edit @bom = Bom.find(params[:id]) @li = @bom.line_item @boms = @li.boms.sorted_by_part_number @parts = Part.sorted_by_number render 'index' end ... 

如果这对解密代码/意图很有用,我有line_items,parts和boms的集合; line_item有很多boms,line_item有许多部分通过boms。 除了零件/订单项关系外,boms还有一个数量。 Bom是物料清单的缩写。 @li是被操纵的line_item。 我遇到问题的表单是查看/添加/编辑属于订单项的boms(数量和部件)的集合。

添加日志

 Started GET "/line_items/8/boms" for 127.0.0.1 at 2013-10-14 14:27:27 -0400 Processing by BomsController#index as HTML Parameters: {"line_item_id"=>"8"} [1m[35mLineItem Load (0.0ms)[0m SELECT "line_items".* FROM "line_items" WHERE "line_items"."id" = ? LIMIT 1 [["id", "8"]] [1m[36mLineItemSubClass Load (1.0ms)[0m [1mSELECT "line_item_sub_classes".* FROM "line_item_sub_classes" WHERE "line_item_sub_classes"."id" = ? ORDER BY "line_item_sub_classes"."id" ASC LIMIT 1[0m [["id", 8]] [1m[35mLineItemClass Load (4.0ms)[0m SELECT "line_item_classes".* FROM "line_item_classes" WHERE "line_item_classes"."id" = ? ORDER BY "line_item_classes"."id" ASC LIMIT 1 [["id", 1]] Rendered shared/_error_messages.html.erb (3.0ms) [1m[36mBom Load (1.0ms)[0m [1mSELECT "boms".* FROM "boms" INNER JOIN "parts" ON "parts"."id" = "boms"."part_id" WHERE "boms"."line_item_id" = ? ORDER BY "parts".number ASC[0m [["line_item_id", 8]] [1m[35mPart Load (0.0ms)[0m SELECT "parts".* FROM "parts" WHERE "parts"."id" = ? ORDER BY "parts"."id" ASC LIMIT 1 [["id", 1]] Rendered boms/_bom_in_table.html.erb (96.0ms) [1m[36mPart Load (1.0ms)[0m [1mSELECT "parts".* FROM "parts" ORDER BY "parts".number ASC[0m Rendered boms/_form_in_table.html.erb (103.0ms) [1m[35m (24.0ms)[0m SELECT SUM(quantity * cost) AS sum_id FROM "parts" INNER JOIN "boms" ON "boms"."part_id" = "parts"."id" WHERE "boms"."line_item_id" = 8 Rendered boms/index.html.erb within layouts/boms (477.0ms) Rendered layouts/_shim.html.erb (1.0ms) Rendered layouts/_header.html.erb (0.0ms) Rendered layouts/_footer.html.erb (0.0ms) Rendered layouts/application.html.erb (69.0ms) Completed 200 OK in 671ms (Views: 601.0ms | ActiveRecord: 31.0ms) Started GET "/boms/22/edit" for 127.0.0.1 at 2013-10-14 14:28:13 -0400 Processing by BomsController#edit as HTML Parameters: {"id"=>"22"} [1m[36mBom Load (0.0ms)[0m [1mSELECT "boms".* FROM "boms" WHERE "boms"."id" = ? LIMIT 1[0m [["id", "22"]] [1m[35mLineItem Load (1.0ms)[0m SELECT "line_items".* FROM "line_items" WHERE "line_items"."id" = ? ORDER BY "line_items"."id" ASC LIMIT 1 [["id", 8]] [1m[36mLineItemSubClass Load (1.0ms)[0m [1mSELECT "line_item_sub_classes".* FROM "line_item_sub_classes" WHERE "line_item_sub_classes"."id" = ? ORDER BY "line_item_sub_classes"."id" ASC LIMIT 1[0m [["id", 8]] [1m[35mLineItemClass Load (0.0ms)[0m SELECT "line_item_classes".* FROM "line_item_classes" WHERE "line_item_classes"."id" = ? ORDER BY "line_item_classes"."id" ASC LIMIT 1 [["id", 1]] Rendered shared/_error_messages.html.erb (0.0ms) [1m[36mBom Load (1.0ms)[0m [1mSELECT "boms".* FROM "boms" INNER JOIN "parts" ON "parts"."id" = "boms"."part_id" WHERE "boms"."line_item_id" = ? ORDER BY "parts".number ASC[0m [["line_item_id", 8]] [1m[35mPart Load (0.0ms)[0m SELECT "parts".* FROM "parts" ORDER BY "parts".number ASC Rendered boms/_form_in_table.html.erb (25.0ms) [1m[36m (0.0ms)[0m [1mSELECT SUM(quantity * cost) AS sum_id FROM "parts" INNER JOIN "boms" ON "boms"."part_id" = "parts"."id" WHERE "boms"."line_item_id" = 8[0m Rendered boms/index.html.erb within layouts/boms (41.0ms) Rendered layouts/_shim.html.erb (0.0ms) Rendered layouts/_header.html.erb (1.0ms) Rendered layouts/_footer.html.erb (0.0ms) Rendered layouts/application.html.erb (54.0ms) Completed 200 OK in 113ms (Views: 104.0ms | ActiveRecord: 3.0ms) Started GET "/boms/22/edit" for 127.0.0.1 at 2013-10-14 14:28:37 -0400 Processing by BomsController#edit as HTML Parameters: {"id"=>"22"} [1m[35mBom Load (0.0ms)[0m SELECT "boms".* FROM "boms" WHERE "boms"."id" = ? LIMIT 1 [["id", "22"]] [1m[36mLineItem Load (0.0ms)[0m [1mSELECT "line_items".* FROM "line_items" WHERE "line_items"."id" = ? ORDER BY "line_items"."id" ASC LIMIT 1[0m [["id", 8]] [1m[35mLineItemSubClass Load (0.0ms)[0m SELECT "line_item_sub_classes".* FROM "line_item_sub_classes" WHERE "line_item_sub_classes"."id" = ? ORDER BY "line_item_sub_classes"."id" ASC LIMIT 1 [["id", 8]] [1m[36mLineItemClass Load (1.0ms)[0m [1mSELECT "line_item_classes".* FROM "line_item_classes" WHERE "line_item_classes"."id" = ? ORDER BY "line_item_classes"."id" ASC LIMIT 1[0m [["id", 1]] Rendered shared/_error_messages.html.erb (0.0ms) [1m[35mBom Load (1.0ms)[0m SELECT "boms".* FROM "boms" INNER JOIN "parts" ON "parts"."id" = "boms"."part_id" WHERE "boms"."line_item_id" = ? ORDER BY "parts".number ASC [["line_item_id", 8]] [1m[36mPart Load (0.0ms)[0m [1mSELECT "parts".* FROM "parts" ORDER BY "parts".number ASC[0m Rendered boms/_form_in_table.html.erb (5.0ms) [1m[35m (0.0ms)[0m SELECT SUM(quantity * cost) AS sum_id FROM "parts" INNER JOIN "boms" ON "boms"."part_id" = "parts"."id" WHERE "boms"."line_item_id" = 8 Rendered boms/index.html.erb within layouts/boms (27.0ms) Rendered layouts/_shim.html.erb (1.0ms) Rendered layouts/_header.html.erb (8.0ms) Rendered layouts/_footer.html.erb (0.0ms) Rendered layouts/application.html.erb (60.0ms) Completed 200 OK in 131ms (Views: 94.0ms | ActiveRecord: 2.0ms) Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/custom.css?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/bootstrap-transition.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/bootstrap-affix.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/bootstrap-alert.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/bootstrap-collapse.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/bootstrap-modal.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:38 -0400 Started GET "/assets/bootstrap-carousel.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap-button.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap-dropdown.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap-scrollspy.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap-tab.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap-typeahead.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap-tooltip.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap-popover.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/bootstrap.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/turbolinks.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/parts.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2013-10-14 14:28:39 -0400 

我相信这是一个HTML问题,而不是Rails问题。 根据此讨论表格中的表格 ,

不能放在

。 移动

以包装表并将控件放在相应的

表单后工作。

我仍然不明白为什么刷新页面使表单工作,但…

如果它是Rails 4,那可能是因为Turbolinks。 试试吧

 data-no-turbolink="true" inside your body tag 

这可能有用,它发生在我身上一次。

此类错误最常由无效HTML生成。 各种错误来源可能是:

  • 缺少<>
  • HTML标记未关闭
  • 孤立的HTML结束标记(没有开放的标记); 在复杂的forms我有额外的 s谎言...
  • 嵌套在tabletr标签内的表单(允许在td内)

表单助手需要正确嵌套,否则这些怪癖会咬你...

尝试将data-no-turbolink =“true”放入调用表页面的链接中。

   

这对我有用。

对于rails 5,请尝试在包含该表单的页面的任何链接中使用data: { turbolinks: false }

例如<%= link_to "Get in Touch", 'contact', data: { turbolinks: false } %>