【106日目】【1日20分のRailsチュートリアル】【第9章】すべてのユーザーを表示するビューを作成する
今日は「9.3.1 ユーザーインデックス」のindexビューを追加するところから。
9.3.1 ユーザーインデックス
今度はすべてのユーザーを表示するために、全ユーザーが格納された変数を作成し、順々に表示するindexビューを実装します。
Userコントローラーにindexアクションを追加。
app/controllers/users_controller.rb
def index @users = User.all end
(すべてのユーザーを一気に読み出すとデータ量が多い場合に問題が生じるのではないかと思われた方、そのとおりです。このキズは9.3.3で修正します。)
一気に読み出すと時間かかりそう。
実際のインデックスページを作成するには、ユーザーを列挙してユーザーごとにliタグで囲むビューを作成する必要があります。
ファイルを作成して
$ touch app/views/users/index.html.erb
下記内容でファイル更新。
app/views/users/index.html.erb
<% provide(:title, 'All users') %> <h1>All users</h1> <ul class="users"> <% @users.each do |user| %> <li> <%= gravatar_for user, size: 50 %> <%= link_to user.name, user %> </li> <% end %> </ul>
訳注: 7.7の1つ目の演習 (リスト7.31) でgravatarメソッドを拡張していない場合、以下のリストがうまく動きません。まだの方は当該リストのコードを先に反映させておいてください。
演習向けブランチでgravatarメソッドを拡張しているのでmasterブランチには反映してない。
リスト7.31の内容を反映しておく。
app/helpers/users_helper.rb
module UsersHelper # 引数で与えられたユーザーのGravatar画像を返す def gravatar_for(user, options = { size: 80 }) gravatar_id = Digest::MD5::hexdigest(user.email.downcase) size = options[:size] gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}" image_tag(gravatar_url, alt: user.name, class: "gravatar") end end
CSS (正確にはSCSSですが) にもちょっぴり手を加えておきましょう (リスト9.35)。
ファイルの一番下に下記を追加。
app/assets/stylesheets/custom.css.scss
/* Users index */ .users { list-style: none; margin: 0; li { overflow: auto; padding: 10px 0; border-bottom: 1px solid $gray-lighter; } }
最後に、サイト内移動用のヘッダーにユーザー一覧表示用のリンクを追加します。
これにはusers_pathを使用し、表7.1に残っている最後の名前付きルートを割り当てます。変更の結果をリスト9.36に示します。
ナビゲーションに追加してたUsers
のリンク先をusers_path
に変更。
app/views/layouts/_header.html.erb
: <li><%= link_to "Users", users_path %></li> :
これでユーザーのインデックスは完全に動くようになり、テストも全てパスするようになります。
テストが通ることを確認。
$ bundle exec rake test 36 tests, 85 assertions, 0 failures, 0 errors, 0 skips
表示も見てみよう。
サーバーを起動して
$ rails server -b $IP -p $PORT
<ローカルアドレス>/users
にアクセス。(ヘッダーの「Users」をクリック)
…1人しかいない。さみしい。
今日の学習時間は【20分】。
次は「9.3.2 サンプルのユーザー」から。