#Railsで簡単なレベル機能を作ってみた
今回はこれまで作ってきたSNSサービスにレベル機能を追加しました。
簡易的なものなのであくまで参考程度にして頂ければと思います。
<開発環境>
- ruby 2.6.3
- Rails 5.1.6
- AWS Cloud9
- GitHub
- sqlite3(develop環境)
設計構想
・一定の経験値(exp)を貯めるとレベルが上がっていく機能。
・投稿と紐づけて自分の食べたラーメンの種類によって得られる経験値が変わる
→postテーブルにexpカラムを設置して投稿するとexpが得られる、postテーブルのuser_idと紐づけてexpの合計値を出す。expの合計値によってレベルに反映されていく。
・userにpostで得られたexpの合計(exp_sum)がlevelとして表示される。
モデル
今回用意するのはpostテーブルにexp(経験値)カラム、userテーブルに経験値の合計であるexp_sumカラム、levelカラムの三つです。
rails g migration add_exp_to_posts exp: integer
rails g migration add_exp_sum_to_users exp_sum: integer
rails g migration add_level_to_users level: integer
この三つを追加したのちにrails db:migrateをします。
## 経験値を得るまでの流れ
上記にもある通り、投稿時に経験値が得られるような仕組みをつくっていきます。
最初に投稿時にどのラーメンを食べたか、そしてラーメンの種類によって得られる経験値が変わるようにselectを使用して選択欄を作りました。
<div class="form-group">
<%= f.select :exp, [["選択して下さい", 0],["小ラーメン・小豚", 50],["小豚ダブル・大ラーメン", 100],["大豚", 150],["大豚ダブル", 200]] %>
</div>
次にcontrollerで経験値を得られるようにしていきます。
def create
@post = current_user.posts.new(post_params)
@user = User.find(current_user.id)
@user.exp_sum += @post.exp.to_i
@user.level = @user.exp_sum.to_i / 50
current_user.update(exp_sum: @user.exp_sum, level: @user.level)
.
.
.
@user.exp_sum += @post.exp.to_iで投稿時に得られるexpの合計値をuserテーブルのexp_sumカラムに送り、exp_sumを50で割った値をレベルとして表示されるようにしました。
## 今後の改良点
このままではレベルが上がるための値が一定値となっているので、改善させていく予定です。