2017-07-14 22 views
3

我是Rails的新手,我不知道這裏發生了什麼。我正在構建的應用程序是一家在線商店。目前的功能工作,但我試圖實現的變化不起作用。作爲一個起點,我將展示我現在的工作版本。這是我的車/ show.html.erb文件:Rails應用程序中的參數可能缺失值

<p id="notice"><%= notice %></p> 

<h2>My Cart</h2> 
<table class="table table-responsive table-striped"> 
    <thead> 
     <tr> 
      <th>Item</th> 
      <th>Quantity</th> 
      <th>Total Price in Galleons</th> 
      <th>Total Price in Muggle Currency</th> 
     </tr> 
     <tbody> 
      <%= render(@cart.line_items) %> 
      <tr> 
       <td>Total</td> 
       <td><%= number_to_currency(@cart.total_price * 7.35) %></td> 
       <td></td> 
       <td></td> 
      </tr> 
     </tbody> 
    </thead> 
</table> 

<br> 

<div class="row"> 
    <div class="col-md-3"> 
     <div class="row"> 
      <div class="col-md-4"> 
       <%= link_to 'Back', products_path, :class => 'btn btn-primary whiteText' %> 
      </div> 
      <div class="col-md-4"> 
       <%= link_to "Checkout", new_charge_path, :class => 'btn btn-success whiteText' %> 
      </div> 
      <div class="col-md-4"> 
       <%= link_to 'Empty Cart', @cart, method: :delete, data: {confirm: 'Are you sure you want to empty your cart?'}, :class => 'btn btn-danger whiteText' %> 
      </div> 
     </div> 
    </div> 
    <div class="col-md-9"></div> 
</div> 

不過,我想改變工作流了一點,所以它使用我的訂單支架,將用戶重定向到一個地址確認頁面(訂單/新.html.erb),點擊購物車展示頁面上的「結帳」。一旦確認地址,它應該將客戶路由到付款頁面,這是我當前Checkout鏈接中的new_charge_path已重定向到的內容。

因此,開始時,我更換結帳鏈接,並從這個打開它:

<%= link_to "Checkout", new_charge_path, :class => 'btn btn-success whiteText' %> 

這樣:

<%= link_to "Checkout", new_order_path, method: :get, :class => 'btn btn-success whiteText' %> 

這重定向功能如預期,並帶我到訂單/ new.html.erb,其中包含以下內容:

<h1>Order Information</h1> 

<br> 

<%= render 'form', order: @order %> 

<%= link_to 'Back', products_path %> 

它呈現的窗體包含以下內容de:

<%= form_for(order) do |f| %> 
    <% if order.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(order.errors.count, "error") %> prohibited this order from being saved:</h2> 

     <ul> 
     <% order.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 


    <div class="row"> 

    <div class="col-md-6"> 

     <div class="field"> 
     <%= f.label :first_name %> 
     <%= f.text_field :first_name, size: 20, :value => current_user.first_name, :class => "form-control" %> 
     </div> 

     <div class="field"> 
     <%= f.label :last_name %> 
     <%= f.text_field :last_name, size: 20, :value => current_user.last_name, :class => "form-control" %> 
     </div> 

     <div class="field"> 
     <%= f.label :address %> 
     <%= f.text_area :address, size: 40, :value => current_user.address, :class => "form-control" %> 
     </div> 

     <div class="field"> 
     <%= f.label :city %> 
     <%= f.text_area :city, size: 20, :value => current_user.city, :class => "form-control" %> 
     </div> 

     <div class="field"> 
     <%= f.label :state %> 
     <%= f.text_area :state, size: 2, :value => current_user.state, :class => "form-control" %> 
     </div> 

     <div class="field"> 
     <%= f.label :email %> 
     <%= f.text_field :email, size: 40, :value => current_user.email, :class => "form-control" %> 
     </div> 

     <div class="field"> 
     <%= f.label :pay_type %> 
     <%= f.select :pay_type, Order.pay_types.keys, prompt: 'Select a payment method', :class => "form-control" %> 
     </div> 

    </div> 



     <div class="col-md-6"> 

     <%= form_tag(payments_path, class: "form-inline") do %> 
      <%= hidden_field_tag(:purchase_amount_cents, @cart.total_price) %> 
      <div class="form_group"> 
      <%= label_tag(:credit_card_number, "Credit Card Number", class: "sr-only") %> 
      <%= text_field_tag(:credit_card_number, "", class: "form-control", placeholder: "Credit Card #") %> 
      </div> 
      <br> 
      <div class="form_group"> 
      <%= label_tag(:expiration_month, "Month", class: "sr-only") %> 
      <%= text_field_tag(:expiration_month, "", class: "form-control", placeholder: "Month") %> 
      <br> 
      <%= label_tag(:expiration_year, "Year", class: "sr-only") %> 
      <%= text_field_tag(:expiration_year, "", class: "form-control", placeholder: "Year") %> 
      <br> 
      <%= label_tag(:cvc, "Year", class: "sr-only") %> 
      <%= text_field_tag(:cvc, "", class: "form-control", placeholder: "CVC#") %> 
      </div> 
      <br> 
      <div class="form_group"> 
      <%= submit_tag("Purchase Cart", class: "btn btn-default", id: "purchase") %> 
      </div> 
     <% end %> 

     </div> 



    </div> 


    <hr> 

    <div class="actions"> 
    <%= f.submit 'Proceed to Payment' %> 
    </div> 
<% end %> 

付款選項是信用卡(條紋)或貝寶。我最終會添加Paypal功能,但Stripe API是我現在所有的功能。

這裏是我的命令控制器:

class OrdersController < ApplicationController 
    include CurrentCart 
    before_action :set_cart, only: [:new, :create] 
    before_action :ensure_cart_isnt_empty, only: :new 
    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) 
    @order.add_line_items_from_cart(@cart) 
    respond_to do |format| 
     if @order.save 
     format.html { redirect_to new_charge_path} 
     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(:first_name, :last_name, :address, :city, :state, :email, :pay_type) 
    end 

    def ensure_cart_isnt_empty 
     if @cart.line_items.empty? 
     redirect_to products_path, notice: 'Your cart is empty!' 
     end 
    end 

end 

這裏是我的充電控制器:

class ChargesController < ApplicationController 
    include CurrentCart 
    before_action :set_cart, only: [:new, :create] 

    def new 
    end 

    def create #METHOD IS CALLED AFTER PAYMENT IS MADE 
    # Amount in cents 
    @amount = @cart.total_price 

    customer = Stripe::Customer.create(
     :email => params[:stripeEmail], 
     :source => params[:stripeToken] 
    ) 

    charge = Stripe::Charge.create(
     :customer => customer.id, 
     :amount  => @amount, 
     :description => 'Customer', 
     :currency => 'usd' 
    ) 

    Cart.destroy(session[:cart_id]) 

    rescue Stripe::CardError => e 
     flash[:error] = e.message 
     redirect_to new_charge_path 
    end 

end 

這裏的問題。儘管重定向按預期工作,但如果使用訂單控制器,則充電控制器中的@amount設置爲0.00美元。但是,如果購物車直接連接到充電控制器,則會使用正確的美元數量。所以,我假設,以某種方式車對象正在丟失或重置其值。

這裏是我的set_cart方法:

def set_cart 
     @cart = Cart.find(params[:id]) 
end 

這裏是我的CurrentCart模塊:

module CurrentCart 
    private 
    def set_cart 
     @cart = Cart.find(session[:cart_id]) 
    rescue ActiveRecord::RecordNotFound 
     @cart = Cart.create 
     session[:cart_id] = @cart.id 
    end 
end 
+0

是否條紋回調到'ChargesController#create'(在網絡掛接)一旦收費? –

+0

我不這麼認爲。 – matt

+0

顯示'set_cart'方法,你在'CurrentCart'中有什麼 – Pavan

回答

0

我的想法,你需要傳遞着價值@cart。從車秀形式TOTAL_PRICE到這裏訂購控制器的一些步驟做

您的內部鏈接(您傳遞價值PARAMS)

<%= link_to "Checkout", new_order_path(total_price: @cart.total_price), method: :get, :class => 'btn btn-success whiteText' %> 

內order_controller(你得到的PARAMS,投放實例variabel)

# GET /orders/new 
    def new 
    @order = Order.new 
    @temp_total_price = params[:total_price] 
    end 

您的form_for標籤之間order_form插入裏面,我們需要把這個形式作爲隱藏的價值,因此它可以通過創建充電方法

<%= hidden_field_tag 'total_price', @temp_total_price %> 

類ChargesController中創建方法,你可以得到TOTAL_PRICE

@total_price = params[:total_price] 

我知道這有點日誌,但或許這可以幫助

+0

不幸的是,當我嘗試時,我在充電控制器中發現一個錯誤,指出未設置數量。 – matt

+0

嘗試在視圖和控制器之間進行跟蹤,可以使用puts命令跟蹤例如在新命令後面的order_controller中,您可以跟蹤puts params [:total_price]檢查它是否爲零/ 0 /其他值 – widjajayd

+0

我試圖在順序中顯示通知使用「at」cart.total_price創建方法。它顯示正確的金額,所以訂單控制器肯定能夠訪問「at」cart.total_price的金額。由於某些原因,充電控制器不能。 我在此評論中使用「at」,因爲Stack Overflow不允許使用符號。 – matt