2015-10-25 3 views
1

я уже чесать голову над этим, но я продолжать получать эту ошибкуРельсы маршрутизации - проблема пути

нет соответствующего маршрута {: действие => «шоу»,: category_id => ноль, : контроллер => "продукты",: идентификатор => NIL} отсутствуют необходимые клавиши: [: cATEGORY_ID,: ID]

в моей простой склонного логики всякий раз, когда я иду на category_product_path и перейти в категорию, я должен иметь список продуктов в этой категории. Но я, вероятно, что-то пропустил. Это мой взгляд файл ... где я попробовал несколько вещей без успеха

<% @products.each do |product| %> 
    <tr> 
     <td><%= link_to product.name, category_product_path(@category) %></td> 
     <td><%= product.category_id %></td> 
     <td><%= number_to_euro(product.price) %></td> 
     <td><%= product.stock %></td> 
     <td><%= image_tag(product.image.thumb) %></td> 
     <br> 
     </tr> 
<% end %> 

Это мои маршруты

namespace :admin do 
    resources :categories 
    resources :products 
    resources :orders 
end 
resources :categories, only: [:index, :show] do 
    resources :products, only: [:index, :show] 
end 
resources :orders, only: [:new, :create] 

И что я предполагаю, что проблема где-то в контроллерах (не те, в папке администратора)

class CategoriesController < ApplicationController  
    before_action :set_category, only: [:show] 
    def index 
     @categories = Category.all 
    end 

    def show 
     @products = @category.products 
    end 

    private 

    def set_category 
     @category = Category.find(params[:id]) 
    end 
end 

class ProductsController < ApplicationController 
    before_action :set_product, only:[:show] 
    def index 
     @products = Product.all 
    end 

    def show 
    end 

    private 

    def set_product 
     @product = Product.find(params[:id]) 
    end 
end 
+1

'category_products_path (category_id: @category)' обратите внимание, что это '' продуктов во множественном числе. – max

+0

Но по-прежнему не так много смысла ссылаться на индекс. Я думаю, что вы ищете 'link_to product.name, category_product_path (category_id: product.category, id: product)' – max

+0

эй. первый не работает, дает ту же ошибку, однако второй работает как шарм. Спасибо. И да, это не имеет большого смысла, я все еще учусь. что я хотел на самом деле сделать, это перейти на страницу категорий, а оттуда выбрать категорию продуктов и перечислить их. так что в основном это индекс в некотором смысле ... или, опять же, это может быть просто «фильтр», если вы будете :). О, и у меня есть вопрос, можете ли вы объяснить мне эту часть 'category_id: product.category, id: product', это неясно, и я не могу ничего найти в документации по rails о путях с несколькими аргументами –

ответ

1

Вам нужно добавить как @category и product переменные маршруту:

<%= link_to product.name, category_product_path(@category, product) %> 

-

Update

Я не знаю, где ты вызывая ваше мнение, но если я прав, думая, что это categories/:category_id/products/, то @category не устанавливается:

#app/controllers/products_controller.rb 
class ProductsController < ApplicationController 
    def index 
     @category = Category.find params[:category_id] 
     @products = @category.products 
    end 
end 

Если вы не делая это, он предлагайте значение @category нет. Чтобы проверить это, вручную вставить значение @category:

<%= link_to product.name, category_product_path("2", product) %> 

Совет: Multiple resource declarations

#config/routes.rb 
namespace :admin do 
    #needs a root 
    resources :categories, :products, :orders 
end 
resources :categories, only: [:index, :show] do 
    resources :products, only: [:index, :show] 
end 
resources :orders, only: [:new, :create] 
+0

спасибо за отзыв, мне нужно больше узнать об этом (маршруты) и собрать его вместе. однако предоставленное решение приводит к «Нет маршрутов, которые соответствуют {: action =>" show ",: category_id => nil,: controller =>" products ",: id =>" 2 "} отсутствующие необходимые ключи: [: category_id] ' , И это становится неясным для меня, zwippie опубликовал что-то похожее, и я понял, что оба они должны быть переданы. но данная @category не работает => и я предполагаю, что это основная причина, может быть, мне нужно определить ее в product_controller? точно так же, как я определил продукты в категориях? это была моя первоначальная мысль –

+0

hahaha, может быть, ответ довольно прост, позвольте мне обновить –

+0

да вот оно !!! га, я думаю, у меня была правильная идея, но просто не знала, как применить ее на практике ... спасибо !!! Один вопрос, однако, max сказал что-то об этом раньше. В обычном приложении вы редко видите индекс продуктов, обычно вы видите продукты на основе категории. в этом случае логично ли было бы использовать другое имя для функции/вида? например ... category_list или еще что-то? –

0

для вложенного маршрута ресурса, вы должны пройти IDS/объекты как категории и продукта:

<%= link_to product.name, category_product_path([product.category_id, product.id]) %> 
+0

hmm ok, i ' вы узнали что-то новое, мне нужно передать их обоим.однако это решение вызывает ошибку - нет маршрутов, соответствующих {: action => "show",: category_id => [1, 2],: controller => "products",: id => nil} missing required keys: [: id] –

Смежные вопросы