先日、ユーザーのログイン頻度を増やすための機能を追加するためポイントシステムを導入しました。
具体的には、ログイン時にポイントを付与し、さらにユーザー間でポイントのやり取りが可能な仕組みです。
以下はその手順です。
目次
ポイントを管理するカラムの追加
まずは、usersテーブル(各アプリによってテーブル名は任意です)にポイントを管理するためのカラムを追加します。
ターミナル
rails generate migration AddPointsToUsers points:integer
作成されたマイグレーションファイルに以下の内容を記載します。
Ruby
class AddPointsToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :points, :integer, default: 0
end
end
マイグレーションを実行します。
ターミナル
rails db:migrate
これで、ポイントを管理するためのカラムが作成されました。
ログインボーナス機能の追加
※今回の実装ではログイン認証にDeviseを使用しています。Deviseを使用せずに実装をされている場合は、適宜コントローラ名、引数名等を読み替えて実装を進めてください。
ファイル名: application_controller.rb
Ruby
def after_sign_in_path_for(resource)
# ↓のコードを有効にすると、ログインボーナスは一日一回という条件が付けられる
if resource.last_login_bonus_date.nil? || resource.last_login_bonus_date < Date.today
# ランダムなログインボーナスを生成
login_bonus = generate_login_bonus
# ユーザーのポイントにログインボーナスを追加
resource.update(points: resource.points + login_bonus, last_login_bonus_date: Date.today)
# ログインボーナスを通知
flash[:success] = "ログインボーナス#{login_bonus} ポイント獲得!"
end
user_path(current_user)
end
def generate_login_bonus
# ランダムなログインボーナスを 1 から 5 の範囲で生成
rand(1..5)
end
ポイントのやり取り機能の追加
以下は、ユーザ間でポイントをやり取りする機能を追加するためのcontrollerの記述です。
※params[:receiver_id]はポイントを送る相手のIDです。
※おまけ機能として、ポイントを送った際相手に自動でメッセージが届く設定にしています。
Ruby
# ... 省略 ...
def new
if params[:receiver_id]
@user = User.find(params[:receiver_id])
else
@users = User.where.not(id: current_user.id)
end
end
def create
receiver = User.find(params[:receiver_id])
amount = params[:amount].to_i
if current_user.send_points(receiver, amount)
# チャットルーム情報の取得・チャットルーム呼び出しまたは作成
conversation = Conversation.between(current_user.id, receiver.id).first
if conversation.nil?
conversation = Conversation.create(sender_id: current_user.id, recipient_id: receiver.id)
end
# 送り先ユーザへのメッセージの作成
message = Message.new(
conversation_id: conversation.id,
user_id: current_user.id,
content: "#{current_user.name}があなたに#{amount}ポイントプレゼントしました。"
)
# 通知
if message.save
flash[:success] = "#{amount}ポイントを#{receiver.name}に送信しました。"
redirect_to user_path(current_user)
else
flash[:alert] = "ポイントの送信に失敗しました。"
redirect_to new_point_path
end
else
flash[:alert] = "ポイントの送信に失敗しました。"
redirect_to new_point_path
end
end
end
最後に
ログインボーナス機能を追加しようと思ったとき、結構ややこしいのではないかと思っていたのですが、案外簡単に実装できました。ポイント機能を実装したいと思っている方はぜひ参考にしてください。