0

eコマース機能をRailsアプリに統合しようとしていますが、新しい注文を作成するのに問題があります。まず、has_many注文、has_manyトランザクションのカートから始めます。注文データベースの最初のフィールドはcart_idです。view / order / new.html.erbからカート内の情報(total_priceなど)にアクセスできる必要があります。

この関係を構築するのに最適な場所はどこで、どのようにしたらよいでしょうか。セッションIDからカートを見つけることができますが、関係を構築する方法がわかりません。私は注文モデルで、新しいアクションで、そのような何かを考えていましたか?

  def new
    @order = Order.new
    current_cart.@order.build

私のアプリケーションコントローラーで定義されているのは、関数current_cartです。

  def current_cart
    Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound
    cart = Cart.create
    session[:cart_id] = cart.id
    cart
  end

アップデート

これが私の新しいcreate関数であり、値が必要な場所です

  def new
    @order = Order.new
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @order }
    end
  end

  # POST /orders
  # POST /orders.json
  def create
    @order = Order.new(params[:order])

       # THIS IS WHERE I HAVE TRIED TO BUILD THE RELATIONSHIP
       # I have tried current_cart.orders.build, @order.cart = current_cart, and 
       # @order = current_cart.build_order(params[:order])

    @order.ip_address = request.remote_ip
    if @order.save
      if @order.purchase
        render :action => "success"
      else
        render :action => "failure"
      end
    else
      render :action => 'new'
    end
  end

これは、モデルのカートにアクセスする必要がある場所です

  def price_in_cents
    (cart.total_price*100).round
  end

そして、ビルド関数または合計価格関数のいずれかの未定義の関数に対して常に例外がキャッチされます

4

3 に答える 3

3

Orderモデルにはcart_idがあるので、そこで関係を定義します。

belongs_to :cart

カートモデルでリレーションを定義することもできます。

has_many :orders

その後、現在のバスケットに新しい注文を追加するだけです。

@order = Order.new
@order.cart = current_cart

編集:

たぶん、current_cartメソッドに他の問題があります。

試す:

@order.cart_id = session[:cart_id]
于 2013-01-20T23:03:10.203 に答える
1

私はこれについてビデオを作りました: http ://www.ror-e.com/info/videos/6

私は実際にカートを注文から分離します。つまり、基本的にカートはhas_many cart_itemで、注文はhas_manyorder_itemsです。もっと手伝いたいです。直接私に連絡してください。さまざまなアプローチの長所と短所について話し合いたいと思います。

于 2013-01-21T07:14:54.907 に答える
0

作成アクションで:

@order = current_cart.build_order(order_params)

強力なパラメータを追加します。

  private

  def order_params
    params.require(:order).permit(:first_name, :last_name, :card_type, :card_expires_on)
  end
于 2015-10-15T21:14:28.613 に答える