前提・実現したいこと
railsでポートフォリオを作成しています。
購入の支払いをした後にuserが購入したかしていないかを判断するためにusersテーブルのboolean型のorderカラムを購入後にtrueにしようと思います
発生している問題・エラーメッセージ
購入の支払いをした後にuserが購入したかしていないかを判断するためにusersテーブルのboolean型のorderカラムを購入後にtrueにしようと思います。updateメソッドを使いupdateしたのですが、データベースに変更が反映されません。 @user.updateとしているところがうまく反映されていません。それ以外は問題なく動いています。また、エラーなどは出ていません。
該当のソースコード
ruby
1 class OrdersController < ApplicationController 2 3 def create 4 redirect_to new_card_path and return unless current_user.card.present? 5 6 @price = Price.find(params[:price_id]) 7 8 Payjp.api_key = ENV["PAYJP_SECRET_KEY"] 9 customer_token = current_user.card.customer_token 10 Payjp::Charge.create( 11 amount: @price.content, 12 customer: customer_token, 13 currency: 'jpy' 14 ) 15 16 @room = Room.find(params[:room_id]) 17 @order = Order.create(price_id: @price.id, room_id: @room.id) 18 @message = Message.create(room_id: @room.id, user_id: @room.user.id, content:"#{current_user.nickname}さんから#{@price.content}円が送られました!!", order: true) 19 @user = User.find(current_user.id) 20 @user.update(order: true) 21 ActionCable.server.broadcast 'stanp_channel', content: @message 22 23 24 end 25 26end 27
ruby
1 2class User < ApplicationRecord 3 has_one_attached :image 4 5 devise :database_authenticatable, :registerable, 6 :recoverable, :rememberable, :validatable 7 8 validates :nickname, :birthday, presence: true 9 10 validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i} 11 12 with_options presence: true, format: { with: /\A[ぁ-んァ-ヶ一-龥々]+\z/ } do 13 validates :first_name 14 validates :last_name 15 end 16 17 with_options presence: true, format: {with:/\A[ァ-ヶ]+\z/} do 18 validates :first_name_katakana 19 validates :last_name_katakana 20 end 21 22 has_many :celebs, through: :rooms 23 has_many :rooms, dependent: :destroy 24 has_many :messages, dependent: :destroy 25 has_one :card, dependent: :destroy 26 has_many :likes, dependent: :destroy 27end 28 29
ruby
1create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 2 t.string "email", default: "", null: false 3 t.string "encrypted_password", default: "", null: false 4 t.string "nickname", null: false 5 t.string "last_name", null: false 6 t.string "first_name", null: false 7 t.string "first_name_katakana", null: false 8 t.string "last_name_katakana", null: false 9 t.date "birthday", null: false 10 t.boolean "order", default: false 11 t.string "reset_password_token" 12 t.datetime "reset_password_sent_at" 13 t.datetime "remember_created_at" 14 t.datetime "created_at", precision: 6, null: false 15 t.datetime "updated_at", precision: 6, null: false 16 t.boolean "admin", default: false 17 t.index ["email"], name: "index_users_on_email", unique: true 18 t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 19 end 20
試したこと
@user = User.find(current_user.id)のあとにbinding.pryを入れて確認してみたところ@userにはしっかりとuserの情報が入っていました
3: def create
4: redirect_to new_card_path and return unless current_user.card.present?
5:
6: @price = Price.find(params[:price_id])
7:
8: Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
9: customer_token = current_user.card.customer_token
10: Payjp::Charge.create(
11: amount: @price.content,
12: customer: customer_token,
13: currency: 'jpy'
14: )
15:
16: @room = Room.find(params[:room_id])
17: @order = Order.create(price_id: @price.id, room_id: @room.id)
18: @message = Message.create(room_id: @room.id, user_id: @room.user.id, content:"#{current_user.nickname}さんから#{@price.content}円が送られました!!", order: true)
19: @user = User.find(current_user.id)
=> 20: binding.pry
21: @user.update(order: true)
22: ActionCable.server.broadcast 'stanp_channel', content: @message
23:
24:
25: end
[1] pry(#<OrdersController>)> @user
=> #<User id: 2, email: "q@q", nickname: "sunny1", last_name: "山田", first_name: "太郎", first_name_katakana: "タロウ", last_name_katakana: "ヤマダ", birthday: "1932-03-02", order: false, created_at: "2021-03-03 07:54:04", updated_at: "2021-03-03 07:54:04", admin: false>
[2] pry(#<OrdersController>)> @user.update(order: true)
=> false
[3] pry(#<OrdersController>)> @user.update(order: 1)
=> false
[4] pry(#<OrdersController>)> @user
=> #<User id: 2, email: "q@q", nickname: "sunny1", last_name: "山田", first_name: "太郎", first_name_katakana: "タロウ", last_name_katakana: "ヤマダ", birthday: "1932-03-02", order: true, created_at: "2021-03-03 07:54:04", updated_at: "2021-03-03 07:54:04", admin: false>
こちらがbinding.pryの結果です。
1回目のpryで@userを入力するとorderはfalseで返ってきました。
しかし2回目でupdateアクションを行うとfalseと返って来るのですが4回目ではorderがtrueとなっています。
3: def create
4: redirect_to new_card_path and return unless current_user.card.present?
5:
6: @price = Price.find(params[:price_id])
7:
8: Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
9: customer_token = current_user.card.customer_token
10: Payjp::Charge.create(
11: amount: @price.content,
12: customer: customer_token,
13: currency: 'jpy'
14: )
15:
16: @room = Room.find(params[:room_id])
17: @order = Order.create(price_id: @price.id, room_id: @room.id)
18: @message = Message.create(room_id: @room.id, user_id: @room.user.id, content:"#{current_user.nickname}さんから#{@price.content}円が送られました!!", order: true)
19: @user = User.find(current_user.id)
20: @user.update(order: true)
=> 21: binding.pry
22: ActionCable.server.broadcast 'stanp_channel', content: @message
[1] pry(#<OrdersController>)> @user.errors.full_messages
=> ["パスワードは不正な値です"]
こちらがbinding.pryをして@user.errors.full_messagesを記述した際のものです
こちらが@user.update!にした時のエラー文です
https://i.gyazo.com/2cc0f56667a78a3e3f9f4bcc9bd292a9.png
自分にはこの解決方法がわかりません。
お力添えをしていただけるとありがたいです。
補足情報(FW/ツールのバージョンなど)
rails [6.0]を使っています
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー