这是在我的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作为成员路由的参数传递。谢谢。
答案 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应该可以正常工作。