如何重定向到“创建”操作?

时间:2014-04-13 21:48:36

标签: ruby-on-rails ruby-on-rails-4

Ruby版本:2.0.0

Rails版本:4.0.1

我有一个控制器来处理Paypal Express Checkout工作流程。当paypal报告成功付款时,我想继续create订单。这是我目前的尝试:

def do_express_checkout
    ##
    # Paypal logic ommited to keep this from being lengthy....
    ##
    @do_express_checkout_payment_response = api.do_express_checkout_payment(@do_express_checkout_payment) if request.post?
    if @do_express_checkout_payment_response.success?
        redirect_to controller: :orders, action: :create, method: :post
    end
end

路由是默认的rails routing:

resources :orders

现在,这只是重定向到/orders(索引方法)。 我该怎么办?

1 个答案:

答案 0 :(得分:2)

您无法重定向到POST操作。 redirect_to仅适用于GET次请求。 使用resources :orders时,createindex的路由看起来完全相同,但HTTP动词除外:

 orders GET    /orders(.:format)                      orders#index
        POST   /orders(.:format)                      orders#create

当你这样做时

redirect_to controller: :orders, action: :create, method: :post

它为GET生成/orders请求,该请求转到index操作。 method不是redirect_to的有效选项,因此会被忽略。

一个丑陋的解决方法,用create动词为GET操作创建重复路由:

  resources :orders
  get "create", to: "orders#create", as: :create_order

这将创建一条路线:

 create_order GET    /create(.:format)                      orders#create

然后您可以更新do_express_checkout方法,如下所示:

if @do_express_checkout_payment_response.success?
    redirect_to create_order_path
end