最近あったこと
Railsで、deviseを使ってサインアウトのリンクを貼っていたところ、ページ遷移が行われなかった。
サーバーのログを確認すると……
Started GET "/users/sign_out" for ::1 at 2016-03-19 13:32:29 +0900
GETでアクセスしてる。
現状
%ul.dropdown-menu{:role => "menu"}
%li
= link_to 'マイページへ', user_path(current_user)
%li
= link_to 'サインアウト', destroy_user_session_path, method: :delete
ちゃんと書いてある。
原因
作業の途中で読み込むべきファイルのrequireを消していた。
(Railsであれば元から記述してあるはず)
(誤)
//= require jquery
//= require turbolinks
//= require bootstrap
(正)
//= require jquery
//= require jquery_ujs ←こいつが必要
//= require turbolinks
//= require bootstrap
これなんだろう
jquery_ujs
Ruby on Rails unobtrusive scripting adapter for jQuery
・force confirmation dialogs for various actions;
・make non-GET requests from hyperlinks;
・make forms or hyperlinks submit data asynchronously with Ajax;
・have submit buttons become automatically disabled on form submit to prevent double-clicking.
だって!!(あとは訳して)
今回の話で言うと、上から2つ目のこれ
・make non-GET requests from hyperlinks;
GET以外のハイパーリンクを結んでくれるらしい。
These features are achieved by adding certain "data" attributes to your HTML markup.
data属性が云々とのことなので、実際に先ほどのHTMLをドン
<li>
<a rel="nofollow" data-method="delete" href="/users/sign_out">サインアウト</a>
</li>
data-method属性にいい感じに指定してくれるっぽいですね。
所感
Railsばっかり弄っていると、こういう所が勝手に上手くいくものと思い込んでたから怖いと思った。これからはRailsの中身も弄って遊んでいきたい。
参考にさせていただいたサイト様
Ruby on Rails unobtrusive scripting adapter for jQuery
TechRacho link_toのmethodが効かない!?