turbolinks 入れたら f.submit が効かなくなった件


概要

本来関係ないはずなんだけど、元々のviewの書き方によってハマる例です。
今回は、<table>の中の<tr>の外に、<form>を書いてたのがいけなかったです。

現象

諸事情により、今まで tubolinks 使ってなかった Railsプロジェクトに turbolinksを導入。

application.js
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks // <-追加
//= require select2           // <-追加
//= require turbolinks        // <-追加
//= require_tree .

ajaxで動いてるところはサクッと動いたのに、なぜか、f.submit のボタンが動かなくなる。
ボタン押しても、リクエストどころか、clickイベントも発火してない模様。
そして、同じページをリロードすると改善する(普通にボタンが動作する)。

原因

関係あるのは link_to だけなハズなのに??? と理不尽に感じつつもいろいろ試し。
↓こちらで、invalid HTML の例が出ていたので気づけました。

app/views/some_models/_form.html.erb
<table>
<%= form_for(@some_models) do |f| %>
(中略)
<% end %>
</table>

こういう書き方だと、こんな風にレンダーされてました。

<table class="ta1">
  <form accept-charset="UTF-8" action="/some_models/xxxxxxxxxx" class="edit_some_model" id="edit_some_model_xxxxxxxxxx" method="post"></form>
  <tbody>
  (中略)
  </tbody>
</table>

<tbody> の外で、<form> が閉じちゃってますので、<tbody><tr><td> の中に書いた <input type="submit"> は効かなったというワケです。

解決

<table> の外に <form> をもってくることで、解決しました。

<%= form_for(@titles) do |f| %>
<table>
(中略)
</table>
<% end %>