Rails 3 - Вложенные ресурсы - Маршрутизация - PullRequest
3 голосов
/ 09 декабря 2010

У меня проблемы с моим методом уничтожения на вложенном исходном продукте, который связан с заказами.

После попытки уничтожить элемент я перенаправляю пользователей на свой order_products_url.Я получаю следующую ошибку маршрутизации:

No route matches "/orders/1/products"

Мой метод уничтожения выглядит следующим образом:

def destroy
    @product = Product.find(params[:id])
    @order = Order.find(params[:order_id])
    @product.destroy

    respond_to do |format|
      format.html { redirect_to(order_products_url) }
      format.xml  { head :ok }
    end
end

И в маршрутах.это меня смущает, это мой метод обновления продуктов, я правильно перенаправляю пользователей на order_products_url без проблем.Я не понимаю, почему это работает там, но не здесь.

Спасибо

Ответы [ 3 ]

8 голосов
/ 09 декабря 2010

order_products_url ожидает передачи параметра - либо идентификатора заказа, либо самого объекта заказа. Без этого это не будет работать должным образом. Итак, используя ваш код выше:

def destroy
    @product = Product.find(params[:id])
    @order = Order.find(params[:order_id])
    @product.destroy

    respond_to do |format|
      format.html { redirect_to(order_products_url(@order) }
      format.xml  { head :ok }
    end
end

В качестве примечания вы можете немного сократить свои маршруты:

resources :orders do
  resources :products
end

Указание контроллера является избыточным, когда он назван так, как ожидает Rails. Надеюсь, это поможет!

ОБНОВЛЕНИЕ: Я добавил ссылку на мою статью о маршрутизации в Rails 3 с загружаемыми примерами кода. Я обновил его с помощью параграфа, который объясняет именованные маршруты в разделе «Вещи, которые вы должны знать»:

Маршрутизация в Ruby on Rails 3

3 голосов
/ 09 декабря 2010

Вам не нужно перенаправлять на order_products_url (@order)?

1 голос
/ 09 декабря 2010

вы должны использовать orer_products_path (не url). Если вы идете в корень своего приложения и набираете,

rake routes

, который даст вам список всех названных маршрутов. Вам нужно добавить к ним _path (возвращает строковое представление). Это удобный маленький трюк для определения именованных маршрутов.

Теперь к вашему реальному вопросу - конечно, его не существует! Вы только что удалили это! Вы уничтожаете товар вместо товара из заказа!

...