条纹自定义付款表单:ActiveRecord::RecordNotFound
Posted
技术标签:
【中文标题】条纹自定义付款表单:ActiveRecord::RecordNotFound【英文标题】:Stripe Custom Payment Form: ActiveRecord::RecordNotFound 【发布时间】:2016-07-18 20:15:48 【问题描述】:我正在按照 Stripe 文档(Stripe Documentation、Stripe Git Repository)中的描述实现 Stripe 的自定义付款表单,但在表单提交后设置实例变量 @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] %>
在支付页面上显示它。请让我知道为什么会这样以及我需要改变什么。谢谢!
【问题讨论】:
能否请您发布开发日志中的错误。出于兴趣,您是否同时使用payment
方法作为 GET 和 POST?
嗨 Robin,我用路由和服务器日志数据更新了原始帖子。数据显示成功接收到 Stripe 令牌,但未设置 @user 变量。我需要将令牌与现有的 user
相关联,然后将该令牌发送回 Stripe 以在 Stripe 中创建 customer
。
【参考方案1】:
这个问题似乎与 Stripe 无关,但与 User.find(session[:user_id])
相关,session[:user_id]
为空。
您如何处理用户身份验证和会话?您可以使用 Devise gem 来查看。
另外,使用User.find
意味着您需要在应用程序的某处(最好是通用的)处理异常ActiveRecord::RecordNotFound
。否则,使用User.find_by
并检查结果是否返回nil
是一种替代方法。
【讨论】:
以上是关于条纹自定义付款表单:ActiveRecord::RecordNotFound的主要内容,如果未能解决你的问题,请参考以下文章