要件
- 各投稿(Book)が表示された回数(閲覧数)をカウントする
- 閲覧数を一覧ページ(indexページ)に表示する
実装の全体的な流れ
- Bookモデルに閲覧数を保存するカラムを追加
show
ページが表示されるたびに閲覧数をカウントする処理を追加index
ページで各Bookの閲覧数を表示
1. Bookモデルに閲覧数を保存するカラムを追加
まず、各投稿の閲覧数を保存するために、Book
モデルに view_count
という新しいカラムを追加します。このカラムに、各投稿が表示された回数を保存していきます。
マイグレーションの作成
新しいカラムを追加するために、「マイグレーション」というデータベースの変更を反映するスクリプトを作成します。
ターミナルで以下のコマンドを実行します。
rails generate migration AddViewCountToBooks view_count:integer
これにより、view_count
カラムを持つマイグレーションファイルが生成されます。
マイグレーションファイルの修正
次に、生成されたマイグレーションファイルを開いて、view_count
の初期値を 0
に設定します。
class AddViewCountToBooks < ActiveRecord::Migration[6.1]
def change
add_column :books, :view_count, :integer, default: 0, null: false
end
end
-
add_column :books, :view_count, :integer, default: 0, null: false
:
これは、books
テーブルにview_count
というカラムを追加し、そのデフォルト値を0
に設定しています。これで、新しく作成された投稿の閲覧数は初期値として0
が設定されます。
マイグレーションを実行
以下のコマンドでマイグレーションを実行し、データベースに変更を適用します。
rails db:migrate
これで、books
テーブルに view_count
カラムが追加され、各投稿の閲覧数を保存する準備が整いました。
2. show
ページが表示されるたびに閲覧数をカウントする処理を追加
次に、各投稿の詳細ページ(show
ページ)が表示されるたびに、その投稿の閲覧数を1増やす処理を追加します。
BooksController
の修正
class BooksController < ApplicationController
def show
@book = Book.find(params[:id])
# 閲覧数を1増やす処理
@book.increment!(:view_count)
end
end
解説
-
@book = Book.find(params[:id])
:
この行は、URLに含まれる投稿IDを使って、その投稿(Book)をデータベースから取得します。 -
@book.increment!(:view_count)
:
これは、投稿のview_count
(閲覧数)を1増やし、データベースにその変更を保存するメソッドです。increment!
は、「指定されたカラムの値を1増やし、その結果をデータベースに反映する」メソッドです。!
が付いていることで、エラーが発生した場合は例外が投げられます。
3. index
ページで各Bookの閲覧数を表示
最後に、投稿の一覧ページ(index
ページ)で各投稿の閲覧数を表示します。
BooksController
の index
アクションの修正
まず、BooksController
の index
アクションで、すべての投稿を取得します。
class BooksController < ApplicationController
def index
@books = Book.all
end
end
index.html.erb
の修正
次に、index
ページで、各投稿の閲覧数を表示します。
<h1>投稿一覧</h1>
<table class="table">
<thead>
<tr>
<th>タイトル</th>
<th>著者</th>
<th>閲覧数</th> <!-- 閲覧数の列を追加 -->
</tr>
</thead>
<tbody>
<% @books.each do |book| %>
<tr>
<td><%= link_to book.title, book_path(book) %></td> <!-- タイトルをリンクとして表示 -->
<td><%= book.author %></td> <!-- 著者名を表示 -->
<td><%= book.view_count %></td> <!-- 閲覧数を表示 -->
</tr>
<% end %>
</tbody>
</table>
解説
-
<%= book.view_count %>
:
これは、各投稿のview_count
(閲覧数)を画面に表示するコードです。@books.each do |book|
で、すべての投稿を順番に取り出し、その閲覧数を表示しています。
まとめ
本日実装した「閲覧数のカウント機能」の流れをもう一度まとめます。
-
view_count
カラムを追加:- 投稿が何回表示されたかを保存するために
view_count
カラムを追加し、デフォルト値を0
に設定。
- 投稿が何回表示されたかを保存するために
-
show
アクションで閲覧数をカウント:- 各投稿の
show
ページが表示されるたびに、view_count
を1増やす処理を追加。
- 各投稿の
-
index
ページに閲覧数を表示:-
index
ページで、すべての投稿のview_count
を表示し、閲覧数が確認できるようにしました。
-
これで、閲覧数をカウントして表示する機能が再現できるようになります。