Routing correto para: has_many: through
-
18-09-2019 - |
Pergunta
Eu estou tentando configurar uma associação muitos-para-muitos entre 2 objetos. Tenho passado por vários tutoriais e ter sido capaz de configurar corretamente o modelo. Meu problema é que eu estou tendo a criação de rotas corretas para que eu possa ver a relação completa ... algo como exibindo apenas os produtos de uma categoria específica problemas ( / Categorias / 1 / products / )
Isto é como eu gerado o modelo:
script/generate scaffold category name:string
script/generate scaffold product name:string
script/generate scaffold categorization category_id:integer product_id:integer
Aqui está o esquema:
ActiveRecord::Schema.define(:version => 20100205210519) do
create_table "categories", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "categorizations", :force => true do |t|
t.integer "category_id"
t.integer "product_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "products", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
end
Aqui está os objetos 3 modelo:
class Category < ActiveRecord::Base
has_many :categorizations
has_many :products, :through => :categorizations
end
class Product < ActiveRecord::Base
has_many :categorizations
has_many :categories, :through => :categorizations
end
class Categorization < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
simples bonito e tudo parece estar funcionando bem, porque eu posso adicionar um produto a uma categoria através do console:
@category.categorizations << Categorization.new(:product_id => 1)
Eu tenho certeza necessidade I para atualizar o arquivo routes.rb mas eu realmente não sei a maneira correta de fazê-lo. Isto é o que eu coloquei no arquivo de rotas:
map.resources :categories, :has_many => :products
Quando tento produtos Vista em uma categoria "/ categorias / 7 / produtos /" simplesmente lista todos os produtos! Será que isso significa o meu percurso está configurado corretamente e eu só precisa escrever uma ação personalizada no controlador de produtos (em vez de ele ir para o índice)? O que estou fazendo de errado aqui ... estou perto ou longe?!?
Graças
Solução
Você provavelmente não está usando os dados da rota para filtrar sua lista de produtos.
No seu método de índice do product_controller, você precisa fazer algo como:
Category.find(params[:category_id]).products
Outras dicas
O que você quer fazer é usar aninhados recursos. O formato é gerais como este:
map.resources :users do |users|
users.resources :posts
end
Leia mais sobre o assunto aqui .
Tal como proposto na esta pergunta , você pode tentar adicionar o pedido de parâmetros:. category_id à sua consulta achado
Sempre olhe para a saída de rotas ancinho .