0
0

More than 3 years have passed since last update.

インスタンス変数とrenderの関係性

Last updated at Posted at 2021-03-11

・【redirect_toRouteControllerViewの道筋を辿るもの、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」は別物なのに、何で同じ名前にしてるんだ・・・?
と思ったため、初心に帰って復習した

users_controller.rb
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
/app/views/users/new.html.erb
<%= 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が画面に表示される。
Ⅲ:Ⅰで@usernameに値が入っているので、それが表示される

なるほど、createメソッド内の@userを別のインスタンス変数にしてたらⅢで何も表示されなくなるのか!
やっぱ何事もちゃんと理由あってやってるんだなと思った

ページ内リンクへ戻る

④結論

render
△【直接Viewに飛ぶもの】
〇【ControllerViewの道筋を辿るもの】
ぐらいに思っておいたほうが良い?

resources: ~において、newcreateupdate等は同じインスタンス変数を使うべきだと分かった。逆に、destroyではわざわざ@userに値を代入する必要が無いことも分かった(値を再表示する必要が無い為)

ページ内リンクへ戻る

3.じゃあ「def create」の「@user」を変えて試してみよう。しかし・・・

①別のにしても情報保持されたままになる!?

users_controller.rb
# 変更部分のみ
  def create
    user = User.new(name: params[:user][:name])
    if user.save

・このように@useruserに変えても情報が保持されたままになる
・では、上記で言ってることは誤りなのか

ページ内リンクへ戻る

②turbolinksを削除したら情報保持されないようになった

application.html.erb
</head>の上にあるこの1行(いわゆるturbolinks)を削除する
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

・これを削除したら情報保持されないようになった
turbolinksは、ページ遷移の際、いちいち読み込みをする必要を無くす役割。(ページ遷移しても更新ボタンが変化しない)
turbolinks導入していると、遷移前と遷移後のページが同じ場合、何も作動しないのと同じとなる?

※ちなみにturbolinks導入していると、「render」「redirect_to」に変えても情報保持されるので注意

ページ内リンクへ戻る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0