Routage correct pour: has_many: par
-
18-09-2019 - |
Question
Je suis en train de mettre en place un grand nombre à plusieurs entre 2 objets. Je suis passé par plusieurs tutoriels et ont été en mesure de régler correctement le modèle. Mon problème est que je ne parviens pas à mettre en place les routes correctes, donc je peux voir la relation complète ... quelque chose comme n'affichant les produits d'une catégorie spécifique ( / catégories / 1 / products / )
Voici comment je le modèle généré:
script/generate scaffold category name:string
script/generate scaffold product name:string
script/generate scaffold categorization category_id:integer product_id:integer
Voici le schéma:
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
Voici les 3 objets du modèle:
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
Assez simple et tout semble fonctionner très bien parce que je peux ajouter un produit à une catégorie via la console:
@category.categorizations << Categorization.new(:product_id => 1)
Je suis sûr que je dois mettre à jour le fichier routes.rb mais je ne sais pas vraiment la bonne façon de le faire. Voilà ce que je mets dans le fichier de routes:
map.resources :categories, :has_many => :products
Lorsque je tente de voir les produits sur une catégorie « / catégories / 7 / produits / » il énumère simplement tous les produits! Est-ce que cela veut dire mon itinéraire est configuré correctement et j'ai juste besoin d'écrire une action personnalisée sur le contrôleur de produits (au lieu de passer à l'index)? Qu'est-ce que je fais mal ici ... suis-je fermer ou loin?!?
Merci
La solution
Vous n'êtes probablement pas en utilisant les données de la route pour filtrer votre liste de produits.
Dans votre méthode d'index de la product_controller, vous devez faire quelque chose comme:
Category.find(params[:category_id]).products
Autres conseils
Comme proposé dans cette question , vous pouvez essayer d'ajouter le paramètre de demande:. category_id à votre requête find
Toujours regarder la sortie des itinéraires râteau .