前提・実現したいこと
railsの練習としてダイエットサイトを作成しております。
tableがそれぞれ、users,rewards,diaries,body_weightsなどあります。
機能としてポイント付与機能を実装いたしましたが、rewardsが作成されるメッソドが同じような記述で増えてしまっております。
あまり、記述として綺麗ではないのかなと思っております。
また今後の実装予定として、userテーブルのランクステータスがポイントに応じてシルバーやゴールドなどに更新するように考えておりますが、その記述も現在のdaiarycontrollerのcreateアクションに記載していいものか悩んでおります。
rewardsが作成されるメッソドなどをmodelに記載するなどの方法は可能でしょうか。
また、書き方としてベストな書き方でしょうか。
該当のソースコード
class DiariesController < ApplicationController def new # viewへ渡すためのインスタンス変数に空のモデルオブジェクトを作成 @diary = Diary.new @body_weight = BodyWeight.new end def create # build=モデルオブジェクトを生成(newの別名) # 1対Nの際、buildによる関連付けメソッド(関連付けメソッド名.build)を使用 @diary = current_user.diaries.build(diary_params) @diary.save # 日記作成ポイント付与 @diary_point = current_user.rewards.build( user_id: current_user.id, point: 10, issue_reason: 2 ) @diary_point.save # 今後この下にuserステータスのポイントに応じた変更を記載予定 # body_weight作成 # 1対1の際、buildによる関連付けメソッド(build_関連付けメソッド名)を使用 @body_weight = @diary.build_body_weight( user_id: current_user.id, weight_record: params[:diary][:body_weight][:weight_record] ) @body_weight.save # 目標体重達成ポイント付与 @weight_record = @body_weight.weight_record @goal_weight = current_user.goal_weight if @weight_record <= @goal_weight @achieve_point = current_user.rewards.build( user_id: current_user.id, point: 100, issue_reason: 5 ) @achieve_point.save end # 今後この下にuserステータスのポイントに応じた変更を記載予定 # createで新規食事記録画面へ遷移(パラメーターをredirect_toに直接渡す) redirect_to new_meal_record_path(id: @diary.id) end
試したこと
modelに記載しようと思い書きましたが、
NoMethodError (undefined method `point' for #Class:0x00007fa7fc0dfad8):
とエラーが出ました。
そもそもmodelに記載することがベストなのかも知りたいです。
class Reward < ApplicationRecord # アソシエーション設定 belongs_to :user # enum機能の定義 enum issue_reason: { 新規登録: 0, ログイン: 1, 日記投稿:2, コメント: 3, フォロー: 4, 目標達成:5 } def point @diary_point = current_user.rewards.build( user_id: current_user.id, point: 10, issue_reason: 2 ) @diary_point.save end end
def create # build=モデルオブジェクトを生成(newの別名) # 1対Nの際、buildによる関連付けメソッド(関連付けメソッド名.build)を使用 @diary = current_user.diaries.build(diary_params) @diary.save # 日記作成ポイント付与 Rewaed.point # 今後この下にuserステータスのポイントに応じた変更を記載予定
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/20 00:56
2020/03/20 01:18
2020/03/20 02:11
2020/03/21 03:23