因此,我正在構建一個通過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
你有:'product_id:@ product.id',但'user_id:@user_id'你試過'user_id:@ user.id'嗎?另外 - 你有沒有檢查過,在調用'id'之前,'@ user'實際上已經正確填充了? –
檢查描述中的更新。 也感謝您的評論我得到了這個鏈接,它給了我更新的解決方法。 http://stackoverflow.com/questions/18423718/rails-devise-current-user-is-nil –
好的,所以你的'@ user'是空的......這意味着這一行:'@user = current_user'沒有按照你認爲的方式工作(正確的,因爲它是'@ user'正在被填充的唯一地方'),你可以暫時添加如下內容:'raise @ user.inspect',你的應用程序會引發一個異常用你在'@ user'中的值,然後你就會知道。 –