質問編集履歴

2 誤字

so_ma

so_ma score 5

2021/03/04 08:00  投稿

boolean型のカラムをupdateメソッドを使いfalseからtrueにする方法
### 前提・実現したいこと
railsでポートフォリオを作成しています。
購入の支払いをした後にuserが購入したかしていないかを判断するためにusersテーブルのboolean型のorderカラムを購入後にtrueにしようと思います
### 発生している問題・エラーメッセージ
```
購入の支払いをした後にuserが購入したかしていないかを判断するためにusersテーブルのboolean型のorderカラムを購入後にtrueにしようと思います。updateメソッドを使いupdateしたのですが、データベースに変更が反映されません。
@user.updateとしているところがうまく反映されていません。それ以外は問題なく動いています。また、エラーなどは出ていません。
```
### 該当のソースコード
```ruby
  class OrdersController < ApplicationController
 def create
   redirect_to new_card_path and return unless current_user.card.present?
   @price = Price.find(params[:price_id])
   Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
   customer_token = current_user.card.customer_token
   Payjp::Charge.create(
   amount: @price.content,
   customer: customer_token,
   currency: 'jpy'
   )
   @room = Room.find(params[:room_id])
   @order = Order.create(price_id: @price.id, room_id: @room.id)
   @message = Message.create(room_id: @room.id, user_id: @room.user.id, content:"#{current_user.nickname}さんから#{@price.content}円が送られました!!", order: true)
   @user = User.find(current_user.id)
   @user.update(order: true)
   ActionCable.server.broadcast 'stanp_channel', content: @message
 end
end
```
```ruby
class User < ApplicationRecord
 has_one_attached :image
 devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable
 validates :nickname, :birthday, presence: true 
 validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i}
 with_options presence: true, format: { with: /\A[ぁ-んァ-ヶ一-龥々]+\z/ } do
   validates :first_name
   validates :last_name
 end
 with_options presence: true, format: {with:/\A[ァ-ヶ]+\z/} do
   validates :first_name_katakana
   validates :last_name_katakana
 end
 has_many :celebs, through: :rooms
 has_many :rooms, dependent: :destroy
 has_many :messages, dependent: :destroy
 has_one :card, dependent: :destroy
 has_many :likes, dependent: :destroy
end
```
```ruby
create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
   t.string "email", default: "", null: false
   t.string "encrypted_password", default: "", null: false
   t.string "nickname", null: false
   t.string "last_name", null: false
   t.string "first_name", null: false
   t.string "first_name_katakana", null: false
   t.string "last_name_katakana", null: false
   t.date "birthday", null: false
   t.boolean "order", default: false
   t.string "reset_password_token"
   t.datetime "reset_password_sent_at"
   t.datetime "remember_created_at"
   t.datetime "created_at", precision: 6, null: false
   t.datetime "updated_at", precision: 6, null: false
   t.boolean "admin", default: false
   t.index ["email"], name: "index_users_on_email", unique: true
   t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
 end
```
```ruby  
 
### 試したこと
@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://gyazo.com/2cc0f56667a78a3e3f9f4bcc9bd292a9https://gyazo.com/2cc0f56667a78a3e3f9f4bcc9bd292a9
https://i.gyazo.com/2cc0f56667a78a3e3f9f4bcc9bd292a9.png
自分にはこの解決方法がわかりません。
お力添えをしていただけるとありがたいです。
### 補足情報(FW/ツールのバージョンなど)
rails [6.0]を使っています
ここにより詳細な情報を記載してください。
  • Ruby

    17992 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    19769 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1 【1】
app/models/user.rb のコード

【2】
db/schema.rb の users 部分

【3】
binding.pry で止めた状態で、「 @user.errors.ful

so_ma

so_ma score 5

2021/03/04 07:59  投稿

boolean型のカラムをupdateメソッドを使いfalseからtrueにする方法
### 前提・実現したいこと
railsでポートフォリオを作成しています。
購入の支払いをした後にuserが購入したかしていないかを判断するためにusersテーブルのboolean型のorderカラムを購入後にtrueにしようと思います
### 発生している問題・エラーメッセージ
```
購入の支払いをした後にuserが購入したかしていないかを判断するためにusersテーブルのboolean型のorderカラムを購入後にtrueにしようと思います。updateメソッドを使いupdateしたのですが、データベースに変更が反映されません。
@user.updateとしているところがうまく反映されていません。それ以外は問題なく動いています。また、エラーなどは出ていません。
```
### 該当のソースコード
```ruby
  class OrdersController < ApplicationController
 def create
   redirect_to new_card_path and return unless current_user.card.present?
   @price = Price.find(params[:price_id])
   Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
   customer_token = current_user.card.customer_token
   Payjp::Charge.create(
   amount: @price.content,
   customer: customer_token,
   currency: 'jpy'
   )
   @room = Room.find(params[:room_id])
   @order = Order.create(price_id: @price.id, room_id: @room.id)
   @message = Message.create(room_id: @room.id, user_id: @room.user.id, content:"#{current_user.nickname}さんから#{@price.content}円が送られました!!", order: true)
   @user = User.find(current_user.id)
   @user.update(order: true)
   ActionCable.server.broadcast 'stanp_channel', content: @message
 end
end
```
```ruby  
 
class User < ApplicationRecord  
 has_one_attached :image  
 
 devise :database_authenticatable, :registerable,  
       :recoverable, :rememberable, :validatable  
 
 validates :nickname, :birthday, presence: true   
 
 validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i}  
 
 with_options presence: true, format: { with: /\A[ぁ-んァ-ヶ一-龥々]+\z/ } do  
   validates :first_name  
   validates :last_name  
 end  
 
 with_options presence: true, format: {with:/\A[ァ-ヶ]+\z/} do  
   validates :first_name_katakana  
   validates :last_name_katakana  
 end  
 
 has_many :celebs, through: :rooms  
 has_many :rooms, dependent: :destroy  
 has_many :messages, dependent: :destroy  
 has_one :card, dependent: :destroy  
 has_many :likes, dependent: :destroy  
end  
 
 
```  
 
```ruby  
create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|  
   t.string "email", default: "", null: false  
   t.string "encrypted_password", default: "", null: false  
   t.string "nickname", null: false  
   t.string "last_name", null: false  
   t.string "first_name", null: false  
   t.string "first_name_katakana", null: false  
   t.string "last_name_katakana", null: false  
   t.date "birthday", null: false  
   t.boolean "order", default: false  
   t.string "reset_password_token"  
   t.datetime "reset_password_sent_at"  
   t.datetime "remember_created_at"  
   t.datetime "created_at", precision: 6, null: false  
   t.datetime "updated_at", precision: 6, null: false  
   t.boolean "admin", default: false  
   t.index ["email"], name: "index_users_on_email", unique: true  
   t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true  
 end  
 
```  
 
```ruby  
 
 
 
### 試したこと
@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://gyazo.com/2cc0f56667a78a3e3f9f4bcc9bd292a9https://gyazo.com/2cc0f56667a78a3e3f9f4bcc9bd292a9  
 
自分にはこの解決方法がわかりません。
お力添えをしていただけるとありがたいです。
### 補足情報(FW/ツールのバージョンなど)
rails [6.0]を使っています
ここにより詳細な情報を記載してください。
  • Ruby

    17992 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    19769 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る