2011-09-10 12 views
3

私はプログラミングに新しいスーパーです。ユーザーセッションにリンクしている私のアプリで働いているショッピングカートを手に入れようとしています。だから、各ユーザーは自分のショッピングカートを持つことができ、誰も他人のカートを見ることはできません。ショッピングカートをユーザーセッションにリンクさせるにはどうすればよいですか?

Railscastsのおかげで作業カートがありましたが、現在は独自のセッションで作成されています。だからあなたがいろいろなユーザーとしてログインすれば、使用中のカートは1つしかなく、すべてのユーザーがそれを共有しています。現在のような作成されて

その:私は限りへのuser_idを追加するなど、持っている

アプリケーションコントローラ

class ApplicationController < ActionController::Base 
    helper :all # include all helpers, all the time 
    protect_from_forgery # See ActionController::RequestForgeryProtection for details 
    helper_method :current_user 
    helper_method :current_cart 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    def current_cart 
    if session[:cart_id] 
     @current_cart ||= Cart.find(session[:cart_id]) 
     session[:cart_id] = nil if @current_cart.purchased_at 
    end 
    if session[:cart_id].nil? 
     @current_cart = Cart.create! 
     session[:cart_id] = @current_cart.id 
    end 
    @current_cart 
    end 
end 

ラインアイテムコントローラ

class LineItemsController < ApplicationController 
    def create 
    @product = Product.find(params[:product_id]) 
    @line_item = LineItem.create!(:cart => current_cart, :product => @product, :quantity => 1, :unit_price => @product.price) 
    flash[:notice] = "Added #{@product.name} to cart." 
    redirect_to current_cart_url 
    end 
end 

カートのモデルと設定ユーザーhas_oneカートとカートはユーザーに属していますが、私は理解できませんカートを実際に稼動させるためにカートを作成する方法を変える必要があるのです。

編集 - セッションコントローラ

def create 
    user = User.authenticate(params[:username], params[:password]) 
    if user 
     session[:user_id] = user.id 
     current_cart.user = current_user 
     current_cart.save 
     redirect_to root_path, :notice => "Welcome back!" 
    else 
     flash.now.alert = "Invalid email or password" 
     render "new" 
    end 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to root_path, :notice => "Logged out!" 
    end 

すべてのヘルプは非常に高く評価されます!

答えて

3

カートはセッションに結びついているので、すべてのユーザーが共有するわけではありません。作成されたブラウザセッションに固有のものです。つまり、LineItemsController#createメソッドを訪れたすべてのブラウザセッションに対して1つのカートがあります。

これは通常、ユーザがログインまたはサインアップする前にカートを作成できるようにするために行われ、実際にカートにアイテムを追加する際の摩擦を軽減します。

カートをユーザーに関連付ける場合は、ログインまたはサインアップするときにこれを行うことができます。リレーションシップを追加した場合、これは次のように簡単になります。

current_cart.user = current_user 
current_cart.save 
+0

ありがとう!カートは、それを設定したユーザーのuser_idで保存されますが、同じブラウザーセッションにログインしていれば、別のユーザーが引き続き使用できます(カートのuser_idフィールドは、最後に何かを追加したユーザーに更新されます)。セッションを終了してログアウト時にカートを削除する方法はありますか? ** edit ** - session destroyメソッドにcurrent_cart.deleteを追加すると、再グルーグ中に「ID = 8のカートを見つけることができませんでした」というメッセージが表示されます。 – Dave

+0

カートをユーザIDで更新するときにセッションから削除します。また、current_cartメソッドで新しいセッションカートを作成する前に、条件付きでカートを割り当てたユーザーを取得する必要があります。 – Codebeef