我正在实施Stripe的自定义付款表单,如条带文档(Stripe Documentation,Stripe Git Repository)中所述,我在提交表单后设置实例变量@user
时遇到问题。
控制器
def payment
@user = User.find(session[:user_id])
if params[:stripeToken] != nil
@token = params[:stripeToken]
if @user.update(:stripe_pmt_token => @token)
create_stripe_customer
redirect_to confirm_path
else
render 'payment'
end
end
end
def create_stripe_customer
Stripe.api_key = "<TOKEN>"
#Create a Customer
@customer = Stripe::Customer.create(
:source => @user[:stripe_pmt_token],
:description => "#{@user.first_name}"
)
@user.update(:stripe_customer_id => @customer.id)
end
路线
get 'payment' => 'checkout#payment'
post 'payment' => 'checkout#payment'
服务器日志
Started POST "/payment" for 69.23.75.159 at 2016-03-31 11:49:01 +0000
Processing by CheckoutController#payment as HTML
Parameters: {"stripeToken"=>"tok_17v<TOKEN>"}
Can't verify CSRF token authenticity
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", nil]]
Completed 404 Not Found in 2ms (ActiveRecord: 0.2ms)
ActiveRecord::RecordNotFound (Couldn't find User with 'id'=):
app/controllers/checkout_controller.rb:5:in `payment'
第一次加载付款页面时,实例变量@user = User.find(session[:user_id])
设置正确。但是,当提交付款表单并且def payment
的代码第二次执行时,实例变量未正确设置。
错误讯息:ActiveRecord::RecordNotFound
和Couldn't find User with 'id'=
以某种方式,rails无法从会话中检索[:user_id]
值,即使已设置并且我能够使用<%= session[:user_id] %>
在付款页面上显示该值。请让我知道为什么会这样,我需要改变什么。谢谢!
答案 0 :(得分:0)
此问题似乎与Stripe无关,但User.find(session[:user_id])
为session[:user_id]
为空。
您如何处理用户身份验证和会话?您可以使用Devise gem查看。
此外,使用User.find
意味着您需要在应用程序中的某处(最好是通用)处理异常ActiveRecord::RecordNotFound
。否则,使用User.find_by
并检查结果是否返回nil
是另一种选择。