使用“member do”在自定义资源操作上路由错误

时间:2011-10-08 13:43:57

标签: ruby-on-rails ruby-on-rails-3 routes ruby-on-rails-3.1

这是在我的routes.rb文件中:

resources :orders do
  member do
    get 'confirm'
    get 'cancel'
  end
end

当然我在orders_controller.rb中写了'确认'和'取消'动作:

def confirm
  @order = Order.find(params[:id])
  #...
end

def cancel
  @order = Order.find(params[:id])
  #...
end

..并在我的“app / views / orders /”文件夹中创建了“confirm.html.erb”和“cancel.html.erb”文件。

但是当我尝试访问 confirm_order_url cancel_order_url 时,我总是遇到此路由错误:

No route matches {:action=>"confirm", :controller=>"orders"}

无法弄清楚缺少什么! 好吗?

PS:我正在使用RoR v.3.1.0

修改#1: 路线设置得恰到好处:

$ rake routes
[..]
 confirm_order GET    /orders/:id/confirm(.:format) {:action=>"confirm", :controller=>"orders"}
  cancel_order GET    /orders/:id/cancel(.:format)  {:action=>"cancel", :controller=>"orders"}
        orders GET    /orders(.:format)             {:action=>"index", :controller=>"orders"}
               POST   /orders(.:format)             {:action=>"create", :controller=>"orders"}
     new_order GET    /orders/new(.:format)         {:action=>"new", :controller=>"orders"}
    edit_order GET    /orders/:id/edit(.:format)    {:action=>"edit", :controller=>"orders"}
         order GET    /orders/:id(.:format)         {:action=>"show", :controller=>"orders"}
               PUT    /orders/:id(.:format)         {:action=>"update", :controller=>"orders"}
               DELETE /orders/:id(.:format)         {:action=>"destroy", :controller=>"orders"}
[...]

修改#2: 也许当我调用confirm_order_url时,Rails不知道如何生成应该像“orders /:id / confirm”的路由,因为@ order.id尚未分配。 但是我在@ order.save之后调用了这个方法。 即,在这里:

  if @order.save
  response = PAYPAL_EXPRESS_GATEWAY.setup_purchase(@order.price_in_cents,
  :ip                => @order.ip_address,
  :return_url        => confirm_order_url,
  :cancel_return_url => cancel_order_url 
  )
  redirect_to PAYPAL_EXPRESS_GATEWAY.redirect_url_for(response.token)

所以这导致了一个子问题:在@ order.save调用之后设置了@ order.id吗? 如果没有,我怎样才能在调用辅助方法之前正确设置它,例如ad confirmation_order_url?

感谢Jayendra Patil我以这种方式修复了我的代码:

  if @order.save
  response = PAYPAL_EXPRESS_GATEWAY.setup_purchase(@order.price_in_cents,
  :ip                => @order.ip_address,
  :return_url        => confirm_order_url(@order),
  :cancel_return_url => cancel_order_url(@order) 
  )
  redirect_to PAYPAL_EXPRESS_GATEWAY.redirect_url_for(response.token)

我错误地认为Rails可以猜测哪个@order我正在调用“成员”网址,所以答案是将@order作为成员路由的参数传递。谢谢。

1 个答案:

答案 0 :(得分:2)

这会生成路线为 -

confirm_order GET    /orders/:id/confirm(.:format) {:action=>"confirm", :controller=>"orders"}
cancel_order GET    /orders/:id/cancel(.:format)  {:action=>"cancel", :controller=>"orders"}

您应该使用这些路线的订单对象或ID -

confirm_order_url(:id => @order.id)
confirm_order_url(@order)

此外,Rails会在保存后自动将id分配给实例,因此@ order.id应该可以正常工作。