Railsのturbolinksを入れることによる影響

`turbolinks`はページ読み込みをしない分ページ遷移を速くするツール。しかし、エラーが起きた際にこれを消すと直ることが何回かあった。そのまとめ。
ちなみにこの記事における`turbolinks`は以下のコードを指す。

```erb:application.html.erb
↓</head>の上にあるこれ
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```

####【ページ内リンク】
[０．環境](#０環境)
[１．背景](#１背景)
[２．flash.nowが作動しない･･･！？](#２flashnowが作動しない)
[３．色々解決。local: trueを忘れてた。](#３色々解決local-trueを忘れてた)
[４．local: trueの役割](#４local-trueの役割)
[５．turbolinksを消すとlink_toがおかしくなる？](#５turbolinksを消すとlink_toがおかしくなる)
[６．結論](#６結論)


#０．環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

#１．背景
この記事を書く前に、既に2つ(3つ？)弊害が起きていた。

###【その１】
`new`と`create`で何故インスタンス変数を同じにするか、`redirect_to`と`render`を何故使い分けるか、の2つの証明が出来なくなる
>[インスタンス変数とrenderの関係性](https://qiita.com/masahiroDIARY/items/7fb16e39260da88b0ba1#turbolinks%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%82%89%E6%83%85%E5%A0%B1%E4%BF%9D%E6%8C%81%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F)

###【その２】
\<table>内のform_withが作動しない
>[\<table>内のform_withが作動しない･･･](https://qiita.com/masahiroDIARY/items/94fb3f855075662e55a4#%EF%BC%93%E8%A7%A3%E6%B1%BA%E7%AD%96%EF%BC%92turbolinks%E5%89%8A%E9%99%A4)

`turbolinks`を切らない方法だと`<table>`の外に`form_with`を置かなければならず、下記リンクの`解決策①`が出来ない場面では`button_to`を諦めるしかなかった。
>[form_with内にbutton_toを入れるとmethodが変わる](https://qiita.com/masahiroDIARY/items/f1051ea477d7a16b26fb#%EF%BC%92%E8%A7%A3%E6%B1%BA%E7%AD%96)

まあ、この2点は自分が工夫すればどうとでも解決できるし、いざとなったら弊害が起きるページだけ`turbolinks`を切ればいいか、ぐらいに思っていた。しかし･･･

[ページ内リンクへ戻る](#ページ内リンク)

#２．flash.nowが作動しない･･･！？
```erb:new.html.erb
<%= flash[:danger] %>   <!--失敗した際ここに表示されるはずなのに･･･-->
<%= form_with model: @user do |f| %>
  <%= f.text_field :name %>
  <%= f.submit "登録" %>
<% end %>
```
```rb:users_controller.rb
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`」した際に前者は再読み込みされず、後者はされていた。
　ああ、こりゃ**背景その２**と同様に`turbolinks`が原因かな。と思い`turbolinks`を切ってみたら無事`"登録に失敗しました"`と表示された。

[ページ内リンクへ戻る](#ページ内リンク)

#３．色々解決。local: trueを忘れてた。
　**「２．」**の解決方法に、`form_with`を`form_for`に変えることが挙げられるが、`form_for`は公式に**非推奨**とされているので却下。
　そういえば`form_with`に`local: true`を付けて無かったことを思い出し、試してみると無事解決！正しく作動した！

```erb:new.html.erb
<%= flash[:danger] %>   <!--失敗した際ここに表示された！･･･-->
<%= form_with model: @user, local: true do |f| %>
  <%= f.text_field :name %>
  <%= f.submit "登録" %>
<% end %>
```
　今まで`local: true`の必要性を感じてなかったが、成程、`form_with`をした際に再読み込みしてくれるようになるのか。
　ちなみに、`local: true`を付けることにより
　**１．【その１】**：解決！
　**１．【その２】**：解決出来なかった･･･
こうなった。`<table>`内の`form_with`問題は本当に分からない。
※`form_for`に変えても解決しなかった

[ページ内リンクへ戻る](#ページ内リンク)

#４．local: trueの役割
`form_with`に「`local: true`」を
　付ける：**Ajax**による送信
　付けず：**HTML**として送信
らしい。

**Ajax**とは、「Asynchronous(非同期) JavaScript ＋ XML」の略らしい。調べてみたら、以下のような感じらしい。

>[【IT用語】Ajaxとは？初心者向けに画像と動画を使って仕組みを分かりやすく解説](http://pikawaka.com/word/ajax)

再読み込みしなくていいって、`turbolinks`みたい。
じゃあこれからは`turbolinks`を消せば直る現象には、`local_true`を試してみようと思った。

[ページ内リンクへ戻る](#ページ内リンク)

#５．turbolinksを消すとlink_toがおかしくなる？
```erb:example.html.erb
<%= link_to "ログアウト", logout_path, method: :delete %>
```
　上記のようなログアウト機能を付けた。リンクを押すとメソッドが**delete**となるが、`turbolinks`を押すとメソッドが変わらず**get**のままとなる。ちなみに`button_to`とするとメソッドが**delete**に切り替わった。
　結局これの原因は分からなかった。これじゃ`turbolinks`を切りようが無い。

[ページ内リンクへ戻る](#ページ内リンク)

#６．結論
　`turbolinks`はページ遷移をとても速くしてくれる反面、弊害が起きることもある。しかし**５**のようなことがあったので、これからも末永くお付き合いしようと思う。

[ページ内リンクへ戻る](#ページ内リンク)