turbolinks
はページ読み込みをしない分ページ遷移を速くするツール。しかし、エラーが起きた際にこれを消すと直ることが何回かあった。そのまとめ。
ちなみにこの記事におけるturbolinks
は以下のコードを指す。
↓</head>の上にあるこれ
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
####【ページ内リンク】
0.環境
1.背景
2.flash.nowが作動しない・・・!?
3.色々解決。local: trueを忘れてた。
4.local: trueの役割
5.turbolinksを消すとlink_toがおかしくなる?
6.結論
#0.環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
#1.背景
この記事を書く前に、既に2つ(3つ?)弊害が起きていた。
###【その1】
new
とcreate
で何故インスタンス変数を同じにするか、redirect_to
とrender
を何故使い分けるか、の2つの証明が出来なくなる
###【その2】
<table>内のform_withが作動しない
turbolinks
を切らない方法だと<table>
の外にform_with
を置かなければならず、下記リンクの解決策①
が出来ない場面ではbutton_to
を諦めるしかなかった。
まあ、この2点は自分が工夫すればどうとでも解決できるし、いざとなったら弊害が起きるページだけturbolinks
を切ればいいか、ぐらいに思っていた。しかし・・・
#2.flash.nowが作動しない・・・!?
<%= flash[:danger] %> <!--失敗した際ここに表示されるはずなのに・・・-->
<%= form_with model: @user do |f| %>
<%= f.text_field :name %>
<%= f.submit "登録" %>
<% end %>
class UsersController < ApplicationController
def create
if !User.create(params.require(:user).permit(:name))
flash.now[:danger] = "登録に失敗しました"
render :new
end
end
end
これで登録失敗しても、何も表示が出ない・・・。ちなみにform_for
にすれば表示された。
form_with
とform_for
の違いを探してみたら、「f.submit
」した際に前者は再読み込みされず、後者はされていた。
ああ、こりゃ背景その2と同様にturbolinks
が原因かな。と思いturbolinks
を切ってみたら無事"登録に失敗しました"
と表示された。
#3.色々解決。local: trueを忘れてた。
「2.」の解決方法に、form_with
をform_for
に変えることが挙げられるが、form_for
は公式に非推奨とされているので却下。
そういえばform_with
にlocal: true
を付けて無かったことを思い出し、試してみると無事解決!正しく作動した!
<%= flash[:danger] %> <!--失敗した際ここに表示された!・・・-->
<%= form_with model: @user, local: true do |f| %>
<%= f.text_field :name %>
<%= f.submit "登録" %>
<% end %>
今までlocal: true
の必要性を感じてなかったが、成程、form_with
をした際に再読み込みしてくれるようになるのか。
ちなみに、local: true
を付けることにより
1.【その1】:解決!
1.【その2】:解決出来なかった・・・
こうなった。<table>
内のform_with
問題は本当に分からない。
※form_for
に変えても解決しなかった
#4.local: trueの役割
form_with
に「local: true
」を
付ける:Ajaxによる送信
付けず:HTMLとして送信
らしい。
Ajaxとは、「Asynchronous(非同期) JavaScript + XML」の略らしい。調べてみたら、以下のような感じらしい。
再読み込みしなくていいって、turbolinks
みたい。
じゃあこれからはturbolinks
を消せば直る現象には、local_true
を試してみようと思った。
#5.turbolinksを消すとlink_toがおかしくなる?
<%= link_to "ログアウト", logout_path, method: :delete %>
上記のようなログアウト機能を付けた。リンクを押すとメソッドがdeleteとなるが、turbolinks
を押すとメソッドが変わらずgetのままとなる。ちなみにbutton_to
とするとメソッドがdeleteに切り替わった。
結局これの原因は分からなかった。これじゃturbolinks
を切りようが無い。
#6.結論
turbolinks
はページ遷移をとても速くしてくれる反面、弊害が起きることもある。しかし5のようなことがあったので、これからも末永くお付き合いしようと思う。