Это в моем файле rout.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
..and создал файлы «verify.html.erb» и «cancel.html.erb» в моей папке «app / views / orders /».
Но когда я пытаюсь получить доступ к verify_order_url или cancel_order_url Я всегда сталкиваюсь с этой ошибкой маршрутизации:
No route matches {:action=>"confirm", :controller=>"orders"}
Не могу понять, чего не хватает!Любая идея, пожалуйста?
PS: Я использую RoR v.3.1.0
EDIT # 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: Возможно, когда я вызываю verify_order_url, Rails не знает, как сгенерировать маршрут, который должен быть похож на "orders /: id / verify", потому что @ 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.id после вызова @ order.save?А если нет, то как я могу правильно установить его перед вызовом вспомогательного метода, такого как подтверждение_ордерного объявления?
РЕШЕНИЕ Благодаря 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 я вызывал URL-адрес "member", поэтому ответом является передача @order в качестве аргумента для маршрутов членов.Спасибо.