🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

2839閲覧

ユーザーとカートのidが結びつかない:Railsでネットショップ

ryota1017stars

総合スコア21

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/10/06 22:36

Railsでネットショップを開発しております。

ユーザー1人に対してカートを1つ設定するロジックにしたいのですが、
カート機能のところで問題があり、投稿しました。

問題は下記になります。
・ユーザーAがサインアップする
・新規にカート(cart_id=1)が作成される
・ユーザーAがログアウトする
・ユーザーBがサインアップする
◆cart_id=2で新規にカートが作成されて欲しいが、
cart_id=1が代入されている状態で「過去のカートが存在する」と判断され、
ユーザーBにcart_id=1のカートが設定される
(新規にカートが作成されない)

ログインするユーザーが変わっているのにsessionのcart_idが保持されてるように思えます。

これまでにカートを作成していない(sessionにcart_idが存在しない)場合はそのユーザーに対して新たに
カートを作成し、これまでにカートを作成している(sessionにcart_idが存在する)場合はcart_idを元にカートモデルを検索し設定します。

ruby

1#現在のユーザーが持つカートを設定する 2def current_cart 3 begin 4 Cart.find(session[:cart_id]) 5 rescue ActiveRecord::RecordNotFound 6 cart = Cart.create 7 session[:cart_id] = cart.id 8 end 9end

ログアウトした場合はセッションを削除しています。

def log_out session.delete(:user_id) @current_user = nil #session[:cart_id] = nil end

上記でsession[:cart_id] = nilをすると、
同じユーザーがログイン、ログアウトを繰り返すたびにカートが
新規に作成されてしまい、ダメでした。

ユーザー1人に対してカートを1つ持たせるにはどのようなロジックにすればよいでしょうか?

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

session[:card_id] が残っている? というのは不思議ですが、その前にuserとcartの関係定義ができていないのでは? と思われます。
User と Cart の関係定義のところを見せて下さい。 has_* とか belongs_toとかのところです
###
関連定義を追加しましょう

class User に has_one :cart
class Cart に belongs_to :user

Userのcontroller の create で,成功した後で
成功したuser.cart.create としておきましょう

そうすると、user.cart でcartが得られますのでsessionに取っておく必要がなくなります。

あと、Cart,Productとの関係では
cartに  has_many :products, through :cart_items
productに has_many :carts, through :cart_items
も定義しておくほうが良いかと。

投稿2019/10/06 23:22

編集2019/10/07 00:28
winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryota1017stars

2019/10/07 00:05

現状カート機能に関する各モデルの関連付けは以下になります。 ```ruby class Cart < ApplicationRecord has_many :cart_items end ``` ```ruby class CartItem < ApplicationRecord belongs_to :product belongs_to :cart end ``` ```ruby class Product < ApplicationRecord end ``` よろしくお願いいたします。
ryota1017stars

2019/10/07 13:52

UsersController内で@user.create_cartと書いたところ、 うまくいきました。 ありがとうございます。 def create @user = User.new(user_params) if @user.save log_in @user flash[:success] = "welcome" @user.create_cart #カートも作成する redirect_to @user else render 'new' end end
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問