Ruby on rails Rails:条带似乎可以工作,但不会产生任何费用

Ruby on rails Rails:条带似乎可以工作,但不会产生任何费用,ruby-on-rails,stripe-payments,Ruby On Rails,Stripe Payments,我有一个rails应用程序,其中Stripe的设置与文档类似。当我点击“用卡支付”按钮并输入测试卡信息时,它会说它成功了,然后给我一条错误消息说: No route matches [POST] "/charges/new" 尽管我的路线是这样的: resources :charges get 'charges/shipping' get 'charges/address' post 'charges/update_order' class ChargesController < Ap

我有一个rails应用程序,其中Stripe的设置与文档类似。当我点击“用卡支付”按钮并输入测试卡信息时,它会说它成功了,然后给我一条错误消息说:

No route matches [POST] "/charges/new"
尽管我的路线是这样的:

resources :charges
get 'charges/shipping'
get 'charges/address'
post 'charges/update_order'
class ChargesController < ApplicationController

   ...

  def new
    @order = current_order
  end

  def create
    # Amount in cents
    @amount = current_order.total * 100
    @user = current_user
    @order = current_order

    if @user.stripe_customer_id
      customer = @user.stripe_customer_id
    else
      customer = Stripe::Customer.create(
        :email => params[:stripeEmail],
        :source  => params[:stripeToken]
      )
      @user.update_attributes(stripe_customer_id: customer.id)
    end
    @order.update_attributes(order_status_id: 2)
    @order.update_attributes(date_placed: DateTime.now)
    # OrderMailer.order_placed(@order.user, @order).deliver_now
    session[:order_id] = nil


    charge = Stripe::Charge.create(
      :customer    => @user.stripe_customer_id,
      :amount      => @amount.to_i,
      :description => 'Rails Stripe customer',
      :currency    => 'usd'
    )

  rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to new_charge_path
  end

  private

  def order_params
    params.permit(:subtotal, :tax, :shipping, :total, :order_status_id, :user_id, :date_placed, :shipping_choice)
  end
end
我的
充电\u控制器
如下所示:

resources :charges
get 'charges/shipping'
get 'charges/address'
post 'charges/update_order'
class ChargesController < ApplicationController

   ...

  def new
    @order = current_order
  end

  def create
    # Amount in cents
    @amount = current_order.total * 100
    @user = current_user
    @order = current_order

    if @user.stripe_customer_id
      customer = @user.stripe_customer_id
    else
      customer = Stripe::Customer.create(
        :email => params[:stripeEmail],
        :source  => params[:stripeToken]
      )
      @user.update_attributes(stripe_customer_id: customer.id)
    end
    @order.update_attributes(order_status_id: 2)
    @order.update_attributes(date_placed: DateTime.now)
    # OrderMailer.order_placed(@order.user, @order).deliver_now
    session[:order_id] = nil


    charge = Stripe::Charge.create(
      :customer    => @user.stripe_customer_id,
      :amount      => @amount.to_i,
      :description => 'Rails Stripe customer',
      :currency    => 'usd'
    )

  rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to new_charge_path
  end

  private

  def order_params
    params.permit(:subtotal, :tax, :shipping, :total, :order_status_id, :user_id, :date_placed, :shipping_choice)
  end
end
class ChargesControllerparams[:stripeEmail],
:source=>params[:stripeToken]
)
@user.update\u属性(stripe\u customer\u id:customer.id)
结束
@订单.更新订单属性(订单状态\u id:2)
@order.update\u属性(放置日期:DateTime.now)
#OrderMailer.order\u已下(@order.user,@order)。立即交付
会话[:order_id]=无
charge=Stripe::charge.create(
:customer=>@user.stripe\u customer\u id,
:amount=>@amount.to_i,
:description=>“Rails条带客户”,
:货币=>“美元”
)
救援条带::CardError=>e
闪光[:错误]=e.message
重定向到新的充电路径
结束
私有的
def order_参数
参数许可(:小计,:税,:发货,:总计,:订单状态\u id,:用户\u id,:放置日期,:发货\u选择)
结束
结束
如果我手动将一个
post“charges/new”
插入
routes.rb
中,它会说它成功了,但它会重定向到同一页面(指示一个
Stripe::carderor
),并且在Stripe仪表板中没有收费寄存器


有人知道我哪里出错了吗?

看起来您不允许在
订单参数中使用'stripeToken'参数。因为camel的情况可能有点复杂,但请确保您允许该param包含以下内容:

params.permit( :"stripeToken" …

如果没有此选项,则该参数为null,并将导致条带故障。

问题在于控制器中的这一部分:

    rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to new_charge_path
您应该删除
将\u重定向到新的\u费用\u路径
,只需让Stripe呈现错误消息即可。错误时无需重定向。Stripe负责为您处理错误(这是Stripe变得伟大的原因之一)

目前,您的
重定向到
被视为每次成功购买后的路径。不仅仅是错误

更新


在进一步查看您的代码后。每次成功购买后,您似乎都没有一个
重定向到
。因此,不管怎样,您都应该删除
重定向到新的\u费用路径
,因为它当前对
=>e
是任意的。它看起来可能和错误处理有关,因为它在那个块下面,但事实上它不是。您应该将
重定向到成功路径
呈现:成功
(例如)添加到
救援条带::CardError=>
的正上方。然后让Stripe处理(或救援)失败的购买尝试,如前所述。

没有看到您的客户端代码,我不能确定-但听起来您的客户端代码正试图发布到
/charges/new
-这不存在-所以失败了。我建议您更新客户端代码,以便将其发送到您想要处理的路由,然后从那里继续调试。

尝试重新启动服务器以重新加载路由。运行
rake routes | grep charges
验证您是否看到
POST/charges/new

等等,我知道为什么。您应该获得
/charges/new
发布
/charges
。向我们显示您的视图代码,特别是表单提交URL地址


请参见

最后,我不得不将表单上的代码更改为
charge\u path
,而不是
new\u charge\u path
,因此它将执行
创建
操作。尽管这与Stripe文档不同,但它最终还是起作用了。

不幸的是,这并不能消除任何错误或使费用得以通过。您是否尝试过:Stripe\u token?我可以想象Rails在将camel case转换为下划线的情况下所做的事情。此时,我可能会添加
byebug
gem,然后在其中添加
byebug
行,以查看我作为参数得到了什么。这同样适用于
params[:stripeEmail]
-我只是得到了一个为零的印象。不幸的是,此删除操作根本没有改变错误行为(嗯……这很奇怪。因为实际发生的情况是,你的重定向是每次购买后的实际路径。仔细查看你的代码后,你似乎没有在每次成功购买后将条带重定向到的路径。因此,无论如何,你应该删除
重定向到新的收费路径
,并添加一个红色直接在“rescue Stripe::CardError”的正上方指向您希望用户在成功充电后结束的位置。您能告诉我们您的
#create
方法的结尾吗?我们看到的是
rescue
块的结尾,但不是
#create
方法的结尾。它应该在成功后重定向。此外,如果出现错误,您应该
render:new
而不是
重定向到new\u charge\u path
,这将擦除所有表单值。