0
6

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 3 years have passed since last update.

Railsで簡単なレベル機能

Posted at

#Railsで簡単なレベル機能を作ってみた

今回はこれまで作ってきたSNSサービスにレベル機能を追加しました。
簡易的なものなのであくまで参考程度にして頂ければと思います。

<開発環境>

  1. ruby 2.6.3
  2. Rails 5.1.6
  3. AWS Cloud9
  4. GitHub
  5. 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を使用して選択欄を作りました。

index.html.erb
<div class="form-group">
 <%= f.select :exp, [["選択して下さい", 0],["小ラーメン・小豚", 50],["小豚ダブル・大ラーメン", 100],["大豚", 150],["大豚ダブル", 200]] %>
</div>

次にcontrollerで経験値を得られるようにしていきます。

posts_controller.rb
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で割った値をレベルとして表示されるようにしました。

## 今後の改良点
このままではレベルが上がるための値が一定値となっているので、改善させていく予定です。

0
6
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
0
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?