【Rails】について言葉でまとめてみた⑥ [他人の掲示板を編集・削除しようとした際の制御]・[collectionルーティング]・[has_many through]・[Railsにおけるajax処理]・[data-remote="true"によるajax処理]・[debuggerを使ったブラウザの検証ツールによるJavascriptコードのデバッグ]・[単一resource(ルーティング)]・[モデルに紐づかないコントローラの実装]・[sorceryのパスワードリセットモジュール]・[gem conf

概要

言葉でまとめてみた⑥

[他人の掲示板を編集・削除しようとした際の制御]・[collectionルーティング]・[has_many through]・[Railsにおけるajax処理]・[data-remote="true"によるajax処理]・[debuggerを使ったブラウザの検証ツールによるJavascriptコードのデバッグ]・[単一resource(ルーティング)]・[モデルに紐づかないコントローラの実装]・[sorceryのパスワードリセットモジュール]・[gem config]・[enum]・[ルーティングのnamespace]について言葉で説明できるようにする

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

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

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

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

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

[他人の掲示板を編集・削除しようとした際の制御]

BoardsControllerのedit update destroyアクションで Board.findを使ってリソースを取得していた場合、どの様な問題点があるか。またどの様な記載が望ましいか。

✖️ これだと、urlに自分のものではない投稿のidを含めると、編集画面に遷移することができてしまう。

def edit
  @boards = Boards.find(params[:id])
end

current_userを使用しているので、現在ログインしているユーザーの投稿の中からparamsの値を使用して投稿を探し、編集画面に遷移してくれる。

また、urlに自分のものではない投稿のidを含めた場合は、current_userの部分に反するので、404(NotFound)のページが表示される。

def edit 
  @boards = current_user.boards.find(params[:id])
end

[collectionルーティング]

membercollectionルーティングはそれぞれどの様な状況で使うか?

違い → ルーテイングにIDがつくかどうか。

memberIDがつく。モデルを個別に操作したい時。特定のリソースを操作したい時。

collectionIDがつかない。:idでurlを識別する必要がない場合に用いる。モデル全体の操作のみを行いたいとき。

[has_many through]

has_many through アソシエーションを設定するメリットは?

中間テーブルで結びついている他のテーブルの値を、中間テーブルを経由して取得することができる。

has_many: 関連名, through: 中間テーブルでユーザーがブックマークした投稿を取得する的な。

[ajax処理]

ajax(エイジャックス)とは何か

JavaScriptを使用して非同期処理を行う。

何が嬉しいか

非同期通信が可能になる。

ページの遷移やページ全体の再読み込みをその都度行わないで済むため、同期通信と比べてユーザーの待機時間が短くなり、利便性が高くなる。

ex)GoogleMAPとか

[data-remote="true"によるajax処理]

form_withのremote trueを有効にした場合、しなかった場合でその後のリクエストの通信にどの様な違いがあるのかを説明せよ。

data-remote="true"あり → Ajaxによって送信。js.erbファイルを探す。

data-remote="true"なし → HTTP通信でform内容を投げる。

[debuggerを使ったブラウザの検証ツールによるJavascriptコードのデバッグ]

JavaScriptのdebuggerメソッドについて。JavaScriptデバッグをターミナルではなく、ブラウザの検証ツールで行わなければならない理由を説明してください。

JavaScriptはフロントエンド(ブラウザで作動する)言語なので、ターミナルにログは表示されず、ブラウザ側の検証ツールにしか表示されない。デバッグにはconsole.log()も使用できる。

[単一resource(ルーティング)]

単一リソースはどんな時に使いますか?resources との違いも説明してください。

idを含める必要がないとき。

例えば、あらゆるユーザーは確実にプロフィールを一つしか持たなく、他人のプロフィールにアクセスする可能性はない 。 その場合ユーザーのIDの情報はシステムが内部的に保持していればよく、URLに視認できる状態で含める意味はない。この場合に単数形リソースを使用することで、通常/profile/:id/editのようになるURLを、/profile/editという形で生成できる。

resourceでルーティングをすると、indexアクションが作成されない。

逆にresourcesは記事などの複数作成でき、対象を絞る必要がある時に使用する。

[モデルに紐づかないコントローラの実装]

プロフィールの編集機能がUsersControllerではなくProfilesControllerで実装されている場合、どのような背景があると考えられるか?

IDを必要としないため。

分離することによって、UsersControllerの肥大化を防ぐため。

プロフィールに関することを、ProfilesControllerに集めることで、変更が容易になる。(*モデルに紐づかなくても操作可能)

プロフィール編集機能の実装

[sorceryのパスワードリセットモジュール]

sorceryのパスワードリセットにおいて、トークンの発行は何のために行なっているのかを説明せよ。

・パスワードリセットを申請した人物が、登録されているメールアドレスの保持者と同一人物であるかを判断するため。

・申請した人が同一人物なら、トークン付きのメールを開いて操作することができ、別人物ならトークン付きのメールを開くことができない(そもそもメールが届かない)。

1.メールアドレスを入力してパスワードの再発行の申請をする[createアクション4.まで]

2.サーバ側ではそのメールアドレスを元にusersテーブルから対象のユーザーを取得する

3.そのユーザーのtokenカラムに「1234abcd」を保存

4.そのトークンを付けたURLをメールでその人に送る

5.ユーザーはそのリンクをクリックする

6.パスワードリセットの画面に行く[editアクション7.まで]

7.パスワードを入力してリセットボタンを押す

8./password_resets/1234abcdにリクエストをなげる[updateアクション10.まで]

9.サーバ側ではリクエストに含まれているトークンをもとにユーザーを特定する

10.そのユーザーのパスワードを変更する

【Rails】パスワード変更(トークンがどのように使用されているのか)

[gem config]

どんな時に使用するか?使用するメリットは何か?

開発環境、本番環境、テスト環境で異なる値を使用したい時に一元管理できる。

【Rails】config について

[enum]

enumを使うことでのメリットは?

admin?のようなインスタンスメソッドや.adminのようなスコープなどの便利メソッドを提供している。

[ルーティングのnamespace]

ルーティングのnamespaceを使用する場面はどのような時?

名前の重複があるとき、衝突を防ぐために使用する。

管理者権限でしか閲覧できないページなど、ページ毎に意味の塊を持たせたい場面。

URLとファイル構成を指定のパスにしたいとき。

【Rails】routes.rb [member][collection][namespace][:shallow] 使い分け