2016-06-22 18 views
1

因此,我正在構建一個通過Stripe處理支付的電子商務平臺。一旦這個成功的處理,我想創建一個訂單條目頁面管理員在訂單頁面上看到。如何將user.id從一個控制器傳遞給另一個「未定義的方法」ID爲零:NilClass「

條紋成功處理付款,再下訂單是通過將捕獲的輸入來創建:

  • @ product.id
  • @ user.id
  • @ product.price

產品和價格正在成功拉出,但不幸的是@ user.id沒有被拉入記錄。我得到以下錯誤: 「未定義的方法`id爲零:NilClass」。

**付款控制器**

class PaymentsController < ApplicationController 
    def create 
    token = params[:stripeToken] 
    @product = Product.find(params[:product_id]) 
    @user = current_user 
    # Create the charge on Stripe's servers - this will charge the user's card 
    begin 
     charge = Stripe::Charge.create(
     :amount => (@product.price*100).to_i, # amount in cents, again 
     :currency => "usd", 
     :source => token, 
     :description => params[:stripeEmail] 
    ) 

     if charge.paid 
     Order.create!(   
      product_id: @product.id, 
      user_id: @user_id, 
      total: @product.price) 
     end 

     flash[:success] = "Payment processed successfully" 
    rescue Stripe::CardError => e 
     #Card was declined 
     body = e.json_body 
     err = body[:error] 
     flash[:error] = "Unfortunately, there was an error processing your payment: #{err[:message]}" 
    end 
    redirect_to product_path(@product) 
    end 
end 

**訂單控制器**

class OrdersController < ApplicationController 
    protect_from_forgery with: :null_session 

    def index 
    end 

    def show 
    end 

    def create 
    end 

    def destroy 
    end 
end 

**顯示頁面,在這裏我渲染支付部分(通過條帶)**

<div class="col-md-6 center text-center"> 
    <div class="container"> 
    <div class="header-spacing"> 
     <%= image_tag(@product.image_url, class:" img-responsive center") %> 
    </div> 

    <h2> 
     <%= @product.name %> 
    </h2> 

    <h4> 
     <%= @product.desc %> 
     <%= @product.style %> 
     <strong>$<%= '%.2f' % @product.price %></strong> 
    </h4> 

    <%= form_tag("/payments/create", remote: true) do %> 
     <%= render partial: "shared/stripe_checkout_button" %> 
     <%= hidden_field_tag(:product_id, @product.id) %> 
    <% end %> 
    </div> 
</div> 

** My OrdersController **

class OrdersController < ApplicationController 
    # before_filter :authenticate_user! 
    protect_from_forgery with: :null_session 

    def index 
    end 

    def show 
    end 

    def create 
    @order = Order.create(order_params) 
    respond_with @order 
    end 

    def destroy 
    end 

    private 

    def order_params 
    params.require(:order).permit(:product_id, :user_id, :total) 
    end 
end 

現在我已經考慮增加:

<%= hidden_field_tag(:user_id, @user.id) %> 

但我得到確切同樣的錯誤。

任何幫助將不勝感激。

UPDATE

原來AJAX請求我做不攜帶CSRF令牌。出於這個原因,Rails正在破壞我的會話。我在我的paymentsController中添加了skip_before_filter:verify_authenticity_token,現在一切正常。

但我仍想知道如何解決/爲什麼發生這種情況,如果任何人有任何信息

更新2

現在我明白這個問題好,我發現一個處理這個問題的老職位可能對其他人有幫助。

Rails simple form gives InvalidAuthenticityToken error

+0

你有:'product_id:@ product.id',但'user_id:@user_id'你試過'user_id:@ user.id'嗎?另外 - 你有沒有檢查過,在調用'id'之前,'@ user'實際上已經正確填充了? –

+0

檢查描述中的更新。 也感謝您的評論我得到了這個鏈接,它給了我更新的解決方法。 http://stackoverflow.com/questions/18423718/rails-devise-current-user-is-nil –

+0

好的,所以你的'@ user'是空的......這意味着這一行:'@user = current_user'沒有按照你認爲的方式工作(正確的,因爲它是'@ user'正在被填充的唯一地方'),你可以暫時添加如下內容:'raise @ user.inspect',你的應用程序會引發一個異常用你在'@ user'中的值,然後你就會知道。 –

回答

4

本質在於form_tag的不自動生成CSRF令牌,除非明確告知這樣做,但是沒有做的form_for標記的,因爲他們在Rails 4切碎這一點。

我只是在我的窗體中添加隱藏的輸入解決了這個問題:

<%= form_tag("/payments/create", remote: true) do %> 
    <%= render partial: "shared/stripe_checkout_button" %> 
    <%= hidden_field_tag(:product_id, @product.id) %> 
    <input type="hidden" value="<%= form_authenticity_token() %>"name="authenticity_token"/> 
<% end %> 

它們切碎自動生成CSRF令牌與人們片段緩存這樣做,因爲真實性令牌將是錯誤的主要原因在從緩存中提取表單的後續請求中。

相關問題