2017-07-14 67 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