・【redirect_to
はRoute
→Controller
→View
の道筋を辿るもの、render
は直接View
に飛ぶもの】ぐらいに思ってた事象が一気に言語化できた
・インスタンス変数への不信感が無くなった
・やっぱりRailsは便利
####【ページ内リンク】
0.環境
1.動機
2.目的は【@user.save】が失敗した時
①@user.save失敗した"後"の流れ
②@user.save失敗する"前"の流れ
③全体の流れ
④結論
3.じゃあ「def create」の「@user」を変えて試してみよう。しかし・・・
①別のにしても情報保持されたままになる!?
②turbolinksを削除したら情報保持されないようになった
#0.環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
#1.動機
下記において、
・「newメソッド
内の@user
」と「createメソッド
内の@user
」は別物なのに、何で同じ名前にしてるんだ・・・?
と思ったため、初心に帰って復習した
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(name: params[:user][:name])
if @user.save
redirect_to どこでも好きな場所
else
render :new
end
end
end
<%= form_with model: @user do |f| %>
<%= f.text_field :name %>
<%= f.submit "登録" %>
<% end %>
#2.目的は【@user.save】が失敗した時
##①@user.save
失敗した"後"の流れ
Ⅰ:render :new
によりnew.html.erb
が画面に表示される。
Ⅱ:終わり
・・・あれ、じゃあ何で入力した値は表示されたままなんだろう
って思ってたけど、@user.save
の前に仕掛けがあったのか!
##②@user.save
失敗する"前"の流れ
Ⅰ:@user = User.new(name: params[:user][:name])
により@user
に値が代入される(save
はされていない)
そういえばRailsコンソールで遊んでた時も、バリデーション定めてたとしてもUser.save
さえしなければどんな値でも入れられたなー。とか思った
##③全体の流れ
Ⅰ:@user = User.new(name: params[:user][:name])
により@user
に値が代入される(save
はされていない)
Ⅱ:render :new
によりnew.html.erb
が画面に表示される。
Ⅲ:Ⅰで@user
のname
に値が入っているので、それが表示される
なるほど、createメソッド
内の@user
を別のインスタンス変数にしてたらⅢで何も表示されなくなるのか!
やっぱ何事もちゃんと理由あってやってるんだなと思った
#④結論
・render
は
△【直接View
に飛ぶもの】
〇【Controller
→View
の道筋を辿るもの】
ぐらいに思っておいたほうが良い?
・resources: ~
において、new
、create
、update
等は同じインスタンス変数を使うべきだと分かった。逆に、destroy
ではわざわざ@user
に値を代入する必要が無いことも分かった(値を再表示する必要が無い為)
#3.じゃあ「def create」の「@user」を変えて試してみよう。しかし・・・
##①別のにしても情報保持されたままになる!?
# 変更部分のみ
def create
user = User.new(name: params[:user][:name])
if user.save
・このように@user
をuser
に変えても情報が保持されたままになる
・では、上記で言ってることは誤りなのか
##②turbolinksを削除したら情報保持されないようになった
↓</head>の上にあるこの1行(いわゆるturbolinks)を削除する
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
・これを削除したら情報保持されないようになった
・turbolinks
は、ページ遷移の際、いちいち読み込みをする必要を無くす役割。(ページ遷移しても更新ボタン
が変化しない)
・turbolinks
導入していると、遷移前と遷移後のページが同じ場合、何も作動しないのと同じとなる?
※ちなみにturbolinks
導入していると、「render」
を「redirect_to」
に変えても情報保持されるので注意