らくだ🐫にもできるRailsチュートリアル|10.3

10.3 すべてのユーザーを表示する

indexアクションを追加してユーザー一覧を表示させる
→データベースにサンプルデータを追加する方法
→ページネーション(pagination=ページ分割)の方法
見本はこちら → RoRT本文

10.3.1 ユーザーの一覧ページ

ユーザーindexページはログインユーザーしか表示できないようにする

indexアクションのリダイレクト

UsersControllerTestにindexアクションが正しくリダイレクトするかを検証するテストを定義していく

indexアクションを定義
UsersControllerのbeforeフィルターのlogged_in_userにindexアクションを追加して保護

indexページを作成

index.html.erbを作る

スタイルを整える

ヘッダーにユーザー一覧表示用のリンクを追加

演習

  1. レイアウトにあるすべてのリンクに対して統合テストを書いてみましょう。ログイン済みユーザーとそうでないユーザーのそれぞれに対して、正しい振る舞いを考えてください。ヒント: log_in_asヘルパーを使ってリスト 5.32にテストを追加してみましょう。

1.
ログインしていない場合としている場合で
それぞれに表示されるリンクに合わせたテストを書く

10.3.2 サンプルのユーザー

indexページの表示の確認のために複数のユーザーを登録したい!
→手作業で追加するのはつらい→Rubyを使って一気に作成!!

Faker gem

実際にいそうな名前のユーザー名を作成するgem

faker gemは開発環境以外では普通使いませんが、今回は例外的に本番環境でも適用させる予定 (10.5) なので、次のようにすべての環境で使えるようにしています。

それでbundle installするけど私の環境ではbundle update必要でした
次にこれ

Example Userという名前とメールアドレスを持つ1人のユーザと、それらしい名前(Faker gemを使用)とメールアドレスを持つ99人のユーザーを作成する
なんで一人目は自分で指定してるの?→使いやすいからじゃん?

create!は基本的にcreateメソッドと同じものですが、ユーザーが無効な場合にfalseを返すのではなく例外を発生させる (6.1.4) 点が異なります。こうしておくと見過ごしやすいエラーを回避できるので、デバッグが容易になります。

現状のデータベースをリセットしてサンプルデータを読み込ませる(Railsタスクを実行)

そこそこ待つ
あとうまくいかない場合はいったんRailssサーバーを止めると吉
→ユーザー一覧ページやコンソールでサンプルデータが100人分になっているのが確認できる

演習

動作確認のみにて省略

10.3.3 ページネーション

indexページにすべてのユーザーが表示されている
→もっとユーザーが増えた時を考えると1ページに全ユーザーが表示されるのでは大変!

ページネーションとは何ぞ

大雑把に言うとページを分割して表示する機能
今回の例で言えばユーザーを30件ずつ表示する。的な。

Railsには豊富なページネーションメソッドがあります。今回はその中で最もシンプルかつ堅牢なwill_paginateメソッドを使ってみましょう。これを使うためには、Gemfileにwill_paginate gem とbootstrap-will_paginate gemを両方を含め、Bootstrapのページネーションスタイルを使ってwill_paginateを構成する必要があります。

gemの追加

bundle installしてサーバーを再起動

ビューの編集

アクションの編集

will_paginateメソッドはusersビューのコードの中から@usersオブジェクトを自動的に見つけ出してページネーションリンクを作成してくれる。すごい!
ただし、will_paginateではpaginateメソッドを使った結果が必要な為@usersに代入してあげる必要がある

paginateでは、キーが:pageで値がページ番号のハッシュを引数に取ります。User.paginateは、:pageパラメーターに基いて、データベースからひとかたまりのデータ (デフォルトでは30) を取り出します。

これにより、params[:page])が1なら1~30のユーザー、params[:page])が2なら31~60のユーザーが取り出され@usersに代入されるようになる
ちなみにページがnilの場合paginateは単に最初のページを返す

I18n

I18nを導入してデフォルト言語をen以外にしているとエラーっぽい表示が出ちゃう

なのでja.ymlを追加する
場所は/sample_app/config/locales/が良いっぽい


こうなる

演習

  1. Railsコンソールを開き、pageオプションにnilをセットして実行すると、1ページ目のユーザーが取得できることを確認してみましょう。
  2. 先ほどの演習課題で取得したpaginationオブジェクトは、何クラスでしょうか? また、User.allのクラスとどこが違うでしょうか? 比較してみてください。
  1. 動作確認のみにて省略
  2. どちらもUser::ActiveRecord_Relationクラスで同じ

10.3.4 ユーザー一覧のテスト

  1. ログイン
  2. indexページにアクセス
  3. 最初のページにユーザーがいることを確認
  4. ページネーションのリンクがあることを確認

この手順でテストをしていく

テストの準備

手順3,4ではテスト用のデータベースに31人以上のユーザーがいる必要があるので
埋め込みRubyを利用してユーザーを追加する

名前付きユーザー2件分は後で必要になるからついでに追加してるんだって

indexページに対する統合テスト

統合テストを生成

テストを定義

演習

  1. 試しにリスト 10.45にあるページネーションのリンク (will_paginateの部分) を2つともコメントアウトしてみて、リスト 10.48のテストが redに変わるかどうか確かめてみましょう。
  2. 先ほどは2つともコメントアウトしましたが、1つだけコメントアウトした場合、テストが greenのままであることを確認してみましょう。will_paginateのリンクが2つとも存在していることをテストしたい場合は、どのようなテストを追加すれば良いでしょうか? ヒント: 表 5.2を参考にして、数をカウントするテストを追加してみましょう。

1.
動作確認のみにて省略
2.

10.3.5 パーシャルのリファクタリング

Railsにはコンパクトなビューを作成するための素晴らしいツールがいくつもあります。この節ではそれらのツールを使って一覧ページのリファクタリング (動作を変えずにコードを整理すること) を行うことにします。

ユーザーリストをrender呼び出しに置き換える

ここではrenderをパーシャル (ファイル名の文字列) に対してではなく、Userクラスのuser変数に対して実行している!
Railsは自動的に_user.html.erbという名前のパーシャルを探しにいく → なのでそのパーシャルを作る
パーシャルのファイルを呼んでいるのではないので「’user’」ではなくて「user」だし
user変数に対して実行しているので、呼び出すパーシャルが_user.html.erb

さらに改良

renderを@users変数に対して直接実行する

Railsは@users をUserオブジェクトのリストであると推測します。さらに、ユーザーのコレクションを与えて呼び出すと、Railsは自動的にユーザーのコレクションを列挙し、それぞれのユーザーを_user.html.erbパーシャルで出力します。

リファクタリング時の注意

リファクタリングを行う前後に必ずテストを行って、結果がGREENになることを確認する!
→コードを実行した結果が変わっていないことを確認!!

演習

動作確認のみにて省略

まとめとか感想

ページネーションって当たり前に思ってたけど、こうやって作ってるのかーってなりました(小並感)
今回もたくさん添削してもらったし、自信が持てないところも「OKだよ」ってしてもらえると安心できてありがたいですのだ。

宣伝ですよ →懐かしさあふれるにゅ~ぶる会のご案内ページはこちら

らくだ🐫にもできるRailsチュートリアルとは

「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。

調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです