Ошибка маршрутизации при настраиваемом действии ресурса с использованием "member do" - PullRequest
0 голосов
/ 08 октября 2011

Это в моем файле 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 в качестве аргумента для маршрутов членов.Спасибо.

1 Ответ

2 голосов
/ 08 октября 2011

Это генерирует маршруты как -

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

. Вы должны использовать объект заказа или идентификатор с этими маршрутами -

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

Также Rails автоматически назначает идентификатор экземпляру после того, как онсохранено, поэтому @ order.id должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...