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

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top