3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ログイン時にボーナスポイントを付与するシステム

Posted at

先日、ユーザーのログイン頻度を増やすための機能を追加するためポイントシステムを導入しました。
具体的には、ログイン時にポイントを付与し、さらにユーザー間でポイントのやり取りが可能な仕組みです。

以下はその手順です。

目次

  1. ポイントを管理するカラムの追加
  2. ログインボーナス機能の追加
  3. ポイントのやり取り機能の追加
  4. 最後に

ポイントを管理するカラムの追加

まずは、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

最後に

ログインボーナス機能を追加しようと思ったとき、結構ややこしいのではないかと思っていたのですが、案外簡単に実装できました。ポイント機能を実装したいと思っている方はぜひ参考にしてください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?