2015-09-26 26 views
0

我很难实现一个结账过程,一旦在购物车,用户可以结帐并发送订单。也许我需要一个订单模型和交易控制器?Rails 4:无法创建结帐

我只是不知道如何设置这些。目前,购物车可以运作,并且可以清理以及添加物品,但我不确定如何实施结帐和订单系统。

想法是:用户在购物车点击结账按钮,然后被采取检查他/她可以输入付款信息,然后被带回到产品页面。问题是,我不确定如何将购物车与结帐和付款流程连接成一个简单易用的系统。

任何帮助将不胜感激,我仍然是非常新的。谢谢。

class CartController < ApplicationController 
    before_action :authenticate_user!, except: [:index] 

    def add 
     id = params[:id] 
      if session[:cart] then 
       cart = session[:cart] 
      else 
       session[:cart] = {} 
       cart = session[:cart] 
      end 
      if cart[id] then 
       cart[id] = cart[id] + 1 
      else 
       cart[id] = 1 
      end 
       redirect_to :action => :index 
       flash[:notice] = 'added to cart' 
    end 


    def clearCart 
     session[:cart] = nil 
     redirect_to :action => :index 
     flash[:notice] = 'cart cleared' 
    end 


    def index 
     if session[:cart] then 
      @cart = session[:cart] 
     else 
      @cart = {} 
     end 
    end  
end 

class ProductsController < ApplicationController 
    before_action :set_product, only: [:show, :edit, :update, :destroy] 

    def index 
    @products = Product.all 
    end 

    def show 
    end 

    def new 
    @product = Product.new 
    end 

    def edit 
    end 

    def create 
    @product = Product.new(product_params) 

    respond_to do |format| 
     if @product.save 
     format.html { redirect_to @product, notice: 'Product was successfully created.' } 
     format.json { render :show, status: :created, location: @product } 
     else 
     format.html { render :new } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @product.update(product_params) 
     format.html { redirect_to @product, notice: 'Product was successfully updated.' } 
     format.json { render :show, status: :ok, location: @product } 
     else 
     format.html { render :edit } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @product.destroy 
    respond_to do |format| 
     format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 


    private 
    def set_product 
     @product = Product.find(params[:id]) 
    end 

    def product_params 
     params.require(:product).permit(:title, :description, :price, :category, :subcategory) 
    end 

end 

class Product < ActiveRecord::Base 
end 

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 

视图/购物车/ index.html.erb

<h1>Your Cart</h1> 


<% if @cart.empty? %> 

<p> Your cart is currently empty</p> 

<% else %> 

<%= link_to 'Empty your Cart', cart_clear_path %> 
<br><br> 
<% end %> 

<% total = 0 %> 

<ul> 
<% @cart.each do | id, quantity | %> 
    <% product = Product.find_by_id(id) %> 

    <li> 
     <%= link_to product.title, product %> 
     <p><%= product.description %></p> 
     <p><%= number_to_currency product.price %></p> 
     <p>Quantity: <%= quantity %></p> 
    </li> 

    <% total += quantity * product.price %> 

<% end %> 

    <p><b><%= number_to_currency total, :unit => '$' %> </b></p>  

</ul> 


我已经试过下面

order.rb

class Order < ActiveRecord::Base 
    belongs_to :cart 
end 

cart.rb

class Cart < ActiveRecord::Base 
    has_many :line_items 
    has_one :order 
end 

Orders_Controller.rb

class OrdersController < ApplicationController 
    before_action :set_order, only: [:show, :edit, :update, :destroy] 

    # GET /orders 
    # GET /orders.json 
    def index 
    @orders = Order.all 
    end 

    # GET /orders/1 
    # GET /orders/1.json 
    def show 
    end 

    # GET /orders/new 
    def new 
    @order = Order.new 
    end 

    # GET /orders/1/edit 
    def edit 
    end 

    # POST /orders 
    # POST /orders.json 
    def create 
    @order = Order.new(order_params) 

    respond_to do |format| 
     if @order.save 
     format.html { redirect_to @order, notice: 'Order was successfully created.' } 
     format.json { render :show, status: :created, location: @order } 
     else 
     format.html { render :new } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /orders/1 
    # PATCH/PUT /orders/1.json 
    def update 
    respond_to do |format| 
     if @order.update(order_params) 
     format.html { redirect_to @order, notice: 'Order was successfully updated.' } 
     format.json { render :show, status: :ok, location: @order } 
     else 
     format.html { render :edit } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /orders/1 
    # DELETE /orders/1.json 
    def destroy 
    @order.destroy 
    respond_to do |format| 
     format.html { redirect_to orders_url, notice: 'Order was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_order 
     @order = Order.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def order_params 
     params.require(:order).permit(:new, :cart_id, :ip_address, :first_name, :last_name, :user_id) 
    end 
end 

添加到结账的意见/车/ index.html.erb

<%= link_to "Checkout", new_order_path, class: "btn btn-primary" %> 

我在这之后做什么?

回答

1

您使用了本地变量产品,而不是控制器属性@product。 (只需添加'@'号)

我奉劝你是使用宝石一样shoppe, 你可以看到例如heredemo

您还可以通过宝石的车型定位,看看他们是如何做了它,也许它会给你一个写电子商务解决方案的清晰视角。