2010-09-05 7 views
0

J'ai créé une table jointe à cet effet. Voici le code:Produits - Catégories association. (edit) appartient à, has_and_belongs_to_many?

class CreateCategoriesProductsJoin < ActiveRecord::Migration 
    def self.up 
    create_table 'categories_products', :id => false do |t| 
     t.column 'category_id', :integer 
     t.column 'product_id', :integer 
    end 
    end 

    def self.down 
    drop_table 'categories_products' 
    end 
end 

Le modèle de produit:

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
    attr_accessor :new_category_name 
    before_save :create_category_from_name 

    def create_category_from_name 
    create_category(:name => new_category_name) unless new_category_name.blank? 
    end 
end 

Et le modèle de la catégorie:

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :products 
end 

Jusqu'à présent, si bon. Le problème est avec le formulaire.html.erb. Code ici:

<p> 
     <label for="product_category_id">Category:</label><br /> 
     <%= f.collection_select :category_id, Category.find(:all), :id, :name, :prompt => "Select a Category" %> 
     or create one: 
     <%= f.text_field :new_category_name %> 
</p> 

J'essaie de charger les catégories dans une boîte de sélection, mais je reçois un message « méthode non définie category_id » pour # ».

Je ne comprends pas pourquoi? J'ai aussi essayé avec has_many: à travers mais la même chose s'est produite.

Je devrais être capable de dessiner les catégories de cette manière puisque les sont associées mais je ne le suis pas. Des idées?

J'ai essayé le screancast de railscast.com mais pas de chance. Avez-vous à l'esprit un tutoriel complet/exemple avec la catégorie de produit, les associations de sous-catégorie? Je n'ai pas encore trouvé de descente (sauf pour les railscast mais ça ne marche pas pour moi).

Merci beaucoup pour votre temps et merci pour le problème qu'il vous a fallu pour répondre (si vous l'avez fait).

Modifier: J'ai trouvé le problème dans le modèle du produit. Voici le correctif:

class Product < ActiveRecord::Base 
    belongs_to :category 

    def category_name 
    category.name if category 
    end 

    def category_name=(name) 
    self.category = Category.find_by_name(name) unless name.blank? 
    end 

end 

Édition 2: J'ai aussi un autre problème avec les catégories.

Le nom de catégorie n'apparaît pas dans la vue. J'appelle la fonction category_name mais je n'ai rien en retour. Comme cela (show.html.erb):

<p> 
     <label for="product_category_id">Category:</label><br /> 
     <%= f.collection_select :category_name, Category.find(:all), :id, :name, :prompt => "Select a Category" %> 
     or create one: 
     <%= f.text_field :new_category_name %> 
</p> 

Or (show.html.erb):

<td><%= product.category_name %></td> 

j'ai essayé de changer de has_and_belongs_to_many :categories et au moins je suis rentré "Catégorie" comme nom qui est bizarre ... car j'ai 4 catégories.

Un produit appartient à une seule catégorie. PS: Encore une fois, merci pour votre temps.

Répondre

0
<%= f.collection_select :category_id ... %> 

Cette ligne est à la recherche de .category_id sur l'objet de forme, qui a accesseurs dépendant de l'objet sous la forme a été créé pour (je suppose qu'il est un objet produit). L'objet produit a des attributs pour la relation has_and_belongs_to_many avec la catégorie, mais il ne s'agit pas d'un identifiant de catégorie unique. Les méthodes disponibles sont listées here.Je ne suis pas certain parce que je ne jamais utiliser has_and_belongs_to_many, mais je pense que vous aurez envie

<%= f.collection_select :categories_singular_ids ... %> 

Le collection_select devra être une sélection multiple, donc pour votre code html vous voulez :multiple => true dans la dernière option hash.

+0

Non qui ne fonctionne pas non plus. – storedope

0

Essayez les points suivants:

<%= f.select :category_ids, Category.pluck(:name, :id), { prompt: "Select a Category" }, multiple: true %> 

N'oubliez pas de permettre category_ids, à savoir: params.require(:product).permit(category_ids: [])

Questions connexes