Rails4

link_toで突然methodが効かなくなって困ってるあなたへ

More than 1 year has passed since last update.

最近あったこと

Railsで、deviseを使ってサインアウトのリンクを貼っていたところ、ページ遷移が行われなかった。

スクリーンショット 2016-03-19 13.32.01.png

サーバーのログを確認すると……

Started GET "/users/sign_out" for ::1 at 2016-03-19 13:32:29 +0900

GETでアクセスしてる。

現状

_header.html.haml
%ul.dropdown-menu{:role => "menu"}
  %li
    = link_to 'マイページへ', user_path(current_user)
  %li
    = link_to 'サインアウト', destroy_user_session_path, method: :delete

ちゃんと書いてある。

原因

作業の途中で読み込むべきファイルのrequireを消していた。
(Railsであれば元から記述してあるはず)

(誤)

application.js
//= require jquery
//= require turbolinks
//= require bootstrap

(正)

application.js
//= 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をドン

headernohtml.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が効かない!?