【Rails】について言葉でまとめてみた④ [ルーティング(REST)]・[includes(N+1問題)]・[フォームヘルパー(form_with)]・[ストロングパラメータ]・[params]・[renderとredirect_toの違い]

概要

言葉でまとめてみた④

[ルーティング(REST)]・[includes(N+1問題)]・[フォームヘルパー(form_with)]・[ストロングパラメータ]・[params]・[renderとredirect_toの違い]について言葉で説明できるようにする

言葉でまとめてみた①はこちら

言葉でまとめてみた②はこちら

言葉でまとめてみた③はこちら

[ルーティング(REST)]

ユーザーを新規作成する際、どんなURL, どんなHTTPメソッドでリクエストを送りますか?RESTfulの考え方を用いて説明せよ。

URL: users

HTTPメソッド: POSTリクエス

→ POST/users

[includes(N+1問題)]

N+1について説明せよ

関連付けを持つあるモデル(A)について、検索をかける際に外部キー参照により関連するテーブル(B)の値も合わせて取得しようとした時、「まずAのレコードN件を取得するクエリが1回、次に各Aレコードに対して関連テーブル(B)の値を引っ張ってくるクエリがN回発行されてしまう」という問題。 見た目上は動くがパフォーマンスが悪い。

N + 1クエリ問題を解決する

[フォームヘルパー(form_with)]

Railsではform_withメソッドが提供されていますが、メリットは何か?

新規作成時・編集時に使用する。

その際にモデルのインスタンスを渡すとよしなにPOSTかPATCHを判断してくれる。Ajax通信を簡単に実現できる。

コントローラーで設定したインスタンス変数が永続化されていなければcreateアクション(新規作成)永続化されていればupdateアクション(編集)に自動で振り分けられる。

(persisted?を使用してコンソールで確認できる)

永続化されているかコンソールで確認してみる。

Board = Board.new
Board.persisted?
=>false

Board2 = Board.first
Board2.permit?
=>true

[ストロングパラメータ]

ストロングパラメータの存在意義は?仮にこれがなかった場合何がまずい?マスアサインメント(一括代入)という言葉を使って説明せよ

フォームにないデータをrequestした時にそれを弾くことができる

マスアサイメント機能(フォームから送られてきたパラメーターをひとつにまとめて、一度に保存できるRailsの機能)を使うと意図せぬ属性が紛れ込んでいるときに想定外の属性についても登録・更新されてしまう(勝手にadminとか作ったりできちゃう)ので、ストロングパラメーターで特定のパラメータを決めておくと安心!

Railsガイド strong-parameters

[params]

POST /boards/10/comments リクエストボディ comment: { body: “hello” }

・コントローラ側で10という情報を取得したい場合はどう書きますか?paramsを使って答えてください。例(params[:board_id])

params[:id]

・コントローラ側でhelloという情報を取得したい場合はどう書きますか?paramsを使って答えてください。

(params[:comment][:body])

・params.require(:user)の:userってHTMLのどこに対応したものですか?

<input type = "user" name = "user"[:email] >

name = "user"[:email]ここの部分に対応している。

[renderとredirect_toの違い]

renderredirect_toについて、それぞれの違いは?

300番代にステータスコードを返すか、200を返すか

redirect_to → HTTPリクエストを送信する。クライアントに返して、リクエストがクライアントからまたくる。routingactionviewの流れになる。

render → HTTPリクエストを送信しない。現在のページにリクエストしたviewを組みこむ。actionは経由しない。