Приложение Rails3 не распознает определенное действие / маршрут

#ruby-on-rails #ruby-on-rails-3.2 #rails-routing

#ruby-on-rails #ruby-on-rails-3.2 #рельсы-маршрутизация

Вопрос:

Определен следующий маршрут:

 resources :products do
  collection do
    get :confirm
  end
  member do
    put :confirmed
  end
end
  

и rake:routes возвращает:

 confirmed_product PUT    /products/:id/confirmed(.:format)  products#confirmed
  

Контроллер имеет определенное действие:

 def confirmed
  @product = Product(params[:id])
  @product.update_column(:paymentstate_id, "1")
  render :action => "confirmed"
end
  

Помощник модели фактически определяет:

 'http://'   @site.host   confirmed_product_path(@product)
  

Тем не менее, после публикации информации на этой странице (из внешнего источника, поскольку это возврат платежа при оформлении заказа) данные возвращаются в

 [host]/products/2/confirmed
  

Но с ошибкой:

 Unknown action
The action '2' could not be found for ProductsController
  

Я ожидал, что элемент ‘member’ позволил бы распознать 2 как id и сгенерировать подтвержденное действие, как rake routes свидетельствует.

Комментарии:

1. Убедитесь, что ваша форма выполняет PUT, а не POST, как по умолчанию, иначе ваш маршрут не будет сопоставлен.

2. хорошая мысль, я предполагал передачу данных как put. Маршрут теперь изменен и функционирует

3. Тогда я перенесу свой комментарий на ответ для вас 😉

Ответ №1:

Если URL-адрес правильный (если помощник генерирует URL-адрес, вы можете считать, что он будет правильным), но вы не можете каким-то образом получить к нему доступ, всегда проверяйте HTTP verb .

Кроме того, 'http://' @site.host confirmed_product_path(@product) доступно в rails как confirmed_product_url(@product) (обратите внимание _url на конец).

Последнее, render action: 'foo' может быть записано render 'foo'

Ответ №2:

Убедитесь, что ваша форма выполняет PUT, а не POST, как по умолчанию, иначе ваш маршрут не будет сопоставлен.