2009-11-23 5 views
3

Je souhaite créer un système de navigation pour mon application Web où il existe plusieurs catégories principales pour les articles et plusieurs sous-tags pour chaque catégorie. Par exemple, dans la catégorie "Écriture", il peut y avoir des sous-catégories comme "Essais", "Poésie" et "Fiction".Navigation dans les catégories Rails avec les tags

Chaque article aurait une liste de balises. Si quelqu'un clique sur le tag "Italie" sur la page de la catégorie de la fiction, je ne voudrais pas que les articles avec le même tag "Italie" provenant d'autres catégories comme Essais ou Poésie apparaissent sur cette page. Lorsqu'une étiquette est cliquée, la page d'affichage est une page d'affichage de catégorie avec un filtre de balise pour tous les articles associés à cette balise particulière dans cette catégorie. Ce ne serait pas une page d'affichage de Tag.

En outre, je voudrais une barre latérale avec des étiquettes connexes. Ceux-ci seraient des étiquettes qui sont dans les mêmes articles que ceux affichés sur la page d'affichage de catégorie dans l'ordre décroissant. J'ai des balises liées à travailler sur la page Tag elle-même mais pas avec la contrainte de catégorie. Jusqu'ici, je peux faire fonctionner les pages de catégorie et les pages de tag séparément, mais j'aimerais intégrer les deux. Je suis actuellement en train d'utiliser Acts comme taggable sur les stéroïdes pour les balises et agit comme arbre pour les catégories.

Des idées?

+0

Je ne suis pas certain, mais vous pourriez essayer de créer un modèle de balise et le définir sur belongs_to: category. Vous devrez ajouter un category_id à votre tableau de tags. Ensuite, vous pouvez faire some_category.tags, et Article.find_tagged_with (some_category.tags) (ou similaire - je ne sais pas comment AaToS est censé être utilisé). Vous pouvez également consulter la fourchette ActsAsTaggableOn de mbleigh: http://github.com/mbleigh/acts-as-taggable-on Il possède des fonctionnalités de balises associées. –

Répondre

0

Matt, merci beaucoup! Cela semble beaucoup plus simple que ce que j'avais initialement pensé. Cependant, mon but était d'inclure des sous-catégories dans la navigation. L'idée est que les catégories parentes auraient tout dans les sous-catégories et que si vous cliquiez sur les sous-catégories, cela les rétrécirait. Je pense que je vais vérifier la pensée de Solr et voir si cela rend mon code plus simple. Après un peu d'essai et d'erreur, j'ai eu mon code pour fonctionner. Cela semble désordonné cependant. Des suggestions sur la simplification?

BTW certaines de ces méthodes sont définies par Aatos

Dans les catégories voir # show:

<% for article in @articles %> 

    <%= link_to article.name, article %> 
    <% unless article.tag_list.empty? %> 
    <p class="tags"> 
    Tags: 
    <%= render :partial => article.tags %> 
    </p> 
    <% end %> 

Et pour la balise/navigation barre latérale je:

<% tag_cloud @tags, %w(css1 css2 css3 css4) do |tag, css_class| %> 
<%= link_to tag, category_path(:filter => tag.name), :class => css_class %> 
<% end %> 

Le modèle de la catégorie , (pas idéal mais ça marche)

class Category < ActiveRecord::Base 
acts_as_tree 
has_many :articles 
has_many :child_articles, :through => :children, :source => :articles 

def grand_articles 
children.map {|c| c.child_articles}.flatten.uniq 
end 

def to_param 
name 
end 

def family 
child_articles + articles + grand_articles 
end 

fin

Enfin, le code du contrôleur laid:

class CategoriesController < ApplicationController 

def show 
@category = Category.find_by_name(params[:id]) 
if (params[:filter]).nil? 
@articles = @category.family 
else 
@articles = Article.find_tagged_with(params[:filter], 
:conditions => ["articles.id IN (?)", @category.family]) 
end 
@tags = 
if (params[:filter]).nil? 
Article.tag_counts :conditions => ["articles.id IN (?)", @category.family] 
else 
Article.find_related_tags(params[:filter], 
:conditions => ["tags.id IN (?)", @category.family.map {|a| a.tags}.flatten.uniq]) 
end 

Il fonctionne mais encore une fois son code laid et fragile. Je suis sûr que j'ai commis de terribles péchés ici. Toutes les suggestions pour le nettoyer est appréciée.

1

Je pense que vous mélangez deux concepts ici, au moins dans la question, peut-être pas dans votre application. Vous avez une liste de catégories modélisée avec acts_as_tree. Cela supporte les sous-catégories. Les tags ne doivent pas appartenir à des sous-catégories. Vous souhaitez filtrer par tag et catégorie, plus ou moins. Vous devriez être en mesure d'écrire de simples requêtes qui renvoient des listes d'articles, tels que:

@articles = Article.find(:all, 
     :include => "categories" 
     :conditions => ["(category_id = ? OR categories.parent_id = ?) AND tag_id = ?", 
         category_id, category_id, tag_id]) 

Une approche plus complexe que je l'ai utilisé pour ce faire est en faisant la navigation à facettes avec Solr. Il prend en charge la combinaison de ces filtres avec la recherche en texte intégral.

Questions connexes