サンプルのユーザー
ユーザーを一気に作成
fakerは実際にいそうなユーザー名を作成するgemです
GemfileにFaker gemを追加する
Gemfile
source 'https://rubygems.org'
gem 'rails', '6.0.3'
gem 'bcrypt', '3.1.13'
gem 'faker', '2.1.2'
gem 'will_paginate', '3.1.8'
gem 'bootstrap-will_paginate', '1.0.0'
.
.
.
サンプルユーザーを生成するRubyスクリプトを追加
データベース上にサンプルユーザーを生成するRailsタスク
db/seeds.rb
# メインのサンプルユーザーを1人作成する
User.create!(name: "Example User",
email: "example@railstutorial.org",
password: "foobar",
password_confirmation: "foobar")
# create!は基本的にcreateメソッドと同じものですが、
# ユーザーが無効な場合にfalseを返すのではなく例外を発生させる
# 追加のユーザーをまとめて生成する
# メイン以外のユーザー99人を作成
99.times do |n|
name = Faker::Name.name
email = "example-#{n+1}@railstutorial.org"
# 数ごとにメアドが変更される
password = "password"
# パスワードは変わらない
User.create!(name: name,
email: email,
password: password,
password_confirmation: password)
end
データベースをリセット
$ rails db:migrate:reset
$ rails db:seed
演習
1.
試しに他人の編集ページにアクセスしてみて、10.2.2で実装したようにリダイレクトされるかどうかを確かめてみましょう。
確認
ページネーション
Gemfileにwill_paginateを追加する
Gemfile
source 'https://rubygems.org'
gem 'rails', '6.0.3'
gem 'bcrypt', '3.1.13'
gem 'faker', '2.1.2'
gem 'will_paginate', '3.1.8'
gem 'bootstrap-will_paginate', '1.0.0'
.
.
.
indexページでpaginationを使う
app/views/users/index.html.erb
<% provide(:title, 'All users') %>
<h1>All users</h1>
<%= will_paginate %>
<ul class="users">
<% @users.each do |user| %>
<li>
<%= gravatar_for user, size: 50 %>
<%= link_to user.name, user %>
</li>
<% end %>
</ul>
<%= will_paginate %>
これではページネートされない。
ページネートの実験
$ rails console
>> User.paginate(page: 1)
User Load (1.5ms) SELECT "users".* FROM "users" LIMIT 11 OFFSET 0
(1.7ms) SELECT COUNT(*) FROM "users"
=> #<ActiveRecord::Relation [#<User id: 1,...
>> User.paginate(page: 1).length
User Load (3.0ms) SELECT "users".* FROM "users" LIMIT ? OFFSET ? [["LIMIT", 30],
["OFFSET", 0]]
=> 30
コンソールの様にしたい。
indexアクションでUsersをページネートする
app/controllers/users_controller.rb
class UsersController < ApplicationController
before_action :logged_in_user, only: [:index, :edit, :update]
before_action :correct_user, only: [:edit, :update]
# before_actionメソッドを使って何らかの処理が実行される直前に
# 特定のメソッドを実行する仕組み
# ログインをさせる
# :editと:updateアクションだけ
def index
@users = User.paginate(page: params[:page])
# allをpaginateメソッドに置き換えます
# :pageパラメーターにはparams[:page]が使われていますが
# 、これはwill_paginateによって自動的に生成されます
end
.
.
.
end
演習
1.
Railsコンソールを開き、pageオプションにnilをセットして実行すると、1ページ目のユーザーが取得できることを確認してみましょう。
確認
2.
先ほどの演習課題で取得したpaginationオブジェクトは、何クラスでしょうか? また、User.allのクラスとどこが違うでしょうか? 比較してみてください。
>> User.paginate(page: 1).class
=> User::ActiveRecord_Relation
>> User.all.class
=> User::ActiveRecord_Relation
同じ