🌷

Rails チュートリアル 10章

に公開

まえがき

Railsチュートリアル10章において押さえておいた方がいいポイントをまとめ、10章の学習内容を俯瞰し整理することを目的とする。


変更したファイル

ファイル名 説明
users_controller.rb beforeフィルタ群を追加。アクション実行前のアクション。また、edit,update,index,destroyの内容を追加。
edit.html.erb パーシャルであるformによってリファクタリングされたのでスリムに。
_header.html.erb Users(ユーザー一覧ページの名前)のリンクを#から更新。
new.html.erb パーシャルであるformによってリファクタリングされたのでスリムに。
user.rb 編集時のみパスワードが空でも許可されるよう、validationを追加。また、セッション作成時に、remember_digestを取得することができるsession_tokenメソッドを追加。
users.yml テストで用いるユーザー情報を追加。ERBを用いて30人分のデータは自動生成している。
users_controller_test.rb プロフィールの編集権限のあるユーザーを確かめるテスト、ユーザー一覧表示権限のあるユーザーを確かめるテスト、ユーザー削除がログインした時のみ実行されているか確認するテスト、ログインしているユーザーに削除権限があるか(管理者か)確認するテストを追加。
sessions_helper.rb 現在ログイン中のユーザーを返すcurrent_userメソッドと、渡されたユーザーがログイン中のユーザーならtrueを返すcurrent_user?メソッドを追加。
custom.scss indexページ用のスタイルを追加。
Gemfile faker,will_paginate,bootstrap-will_paginateを追加
seeds.rb データベース上にサンプルユーザを生成する。権限付与の都合上、1人(管理者 admin: true)と残り99人という感じで定義。

追加したファイル

ファイル名 作成方法 説明
users_edit_test.rb generate integration_testで自動作成 フレンドリーフォワーディング(まだログインしてませんよなどの指摘を受けた後、元アクセスしようとしていたページに戻してくれる親切な仕組み)がうまくいっているか確認するテスト。
index.html.erb 手動で作成 ユーザー一覧ページのビューファイル。ページネーションをつけている点で特殊。
users_index_test.rb generate integration_testで自動作成 ページネーションが2つ表示されているかについてのテスト、削除についてのテストを含む表示の形式なりなんなりindexのビューに関するテストファイル。
_user.html.erb 手動で作成 各ユーザーを表示するパーシャル部分。indexのビューファイルで呼び出す。この中に、ユーザーが管理者である時のみ表示されるdeleteに関する記述も。ちなみに、turboによってDELETEリクエストを偽造。
<タイムスタンプ>_add_admin_to_users.rb generate migrationで自動作成 削除権限を付与するユーザ(管理者)について管理するための属性、adminをデータベースに加えるために作成。
edit.html.erb 手動で作成 signupと似たような形式でユーザー情報の編集のためのフォームを作成。
_form.html.erb 手動で作成 new,editの共通部分をリファクタリングするために作成

before_actionとは

before_actionとはコントローラーで用いるもの。ルーティングファイルにおいて指定されたアクションを実行する前に実行するメソッド(アクション)を指定する。only: でアクション名をシンボルとして指定することによって、そのアクションの前に実行する。というのを指定できる。

users_controller
# 具体例
before_action :logged_in_user, only: [:edit, :update]
# 抽象化すると以下
before_action <アクションのシンボル>, <発動条件(アクションのシンボル)>

サンプルユーザーをデータベースに加える

以下のようなコードを実行することで、seeds.rbで指定した通りにサンプルユーザーを加えることができる。

bash
rails db:seed

ページネーションとは?

ページネーションとは、一覧ページなど、大量にデータがあるとき、データを分割して、ページ送りをする形式とし、そのページ送りを快適に行うために設置されるボタンみたいな領域(リンク)のことである。ビューファイル上では以下のようにして呼び出す。

<%= will_paginate %>

他にしたこと

  • rel="noopener"と指定することで、フィッシングのリスクを排除できる。
  • 新たにユーザー情報が編集可能なedit.html.erbを作成し、新規ユーザー登録のnew.html.erbと合わせてリファクタリングするため、_form.html.erbを作成した。
  • html.erbでtarget="_blank"のように指定すると、新しいタブが開く。
  • @user.reloadメソッドによってユーザー情報を再びデータベースから読み込むことができる。つまり更新内容の正しさを判定可能。
  • assert_redirected_toとredirect_toが混ざっていたが前者はテスト用、後者はコントローラー用であり、後者ではそのURLに移動せよというレスポンスを返す。
  • Userモデルのvalidationにallow_nilを加えた。これにより、ユーザー情報編集(edit)の際にわざわざパスワードを入力せず空にした状態も編集が通る。
  • 今回出てきたsession_tokenはremember_tokenとは異なり属性でも仮想属性でもなくメソッドである点に注意!紛らわしい!
  • request.original_urlではリクエスト先が取得できる。
  • フレンドリーフォワーディングのためのURL取得はセッションがリセットされちゃう前に!
  • indexページはユーザ一覧ページ
  • user/edit,user/updateの違い。前者は編集用のフォームを表示する。後者は送信されたフォームを受け取って保存する役割を持っているので、微妙に異なるもの。
  • paginateメソッドは:pageをパラメータに用いて、データベースから一塊のデータを取り出す機能を持つ。
  • 管理者ユーザーか否かを判断するための属性adminのdefault値はfalseとしておく!書かなくてもいいが万全を期す感じで。

Discussion