带标签的Rails类别导航

时间:2009-11-23 21:45:47

标签: ruby-on-rails navigation tags categories

我想为我的网络应用程序创建一个导航系统,其中有几个主要的文章类别和每个类别的几个子标记。

例如,在“写作”类别中,可能会有“Essays”,“Poetry”和“Fiction”等子类别。

每篇文章都有一个标签列表。如果有人点击小说类别节目页面上的标签“意大利”,我就不希望其他类别如文章或诗歌的“意大利”标签出现在该页面上。

单击标记时,显示页面将是一个类别显示页面,其中包含该类别中具有该特定标记的所有文章的标记过滤器。它不会是标签显示页面。

另外,我想要一个带有相关标签的侧边栏。这些标签与降序显示在类别显示页面上的文章相同。我得到了相关的标签来处理Tag页面本身,但没有使用类别约束。

到目前为止,我可以将类别页面和标记页面分开工作,但我想整合两者。

我目前正在使用Acts作为Taggable类固醇标签和行为树作为类别。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我认为你在这里混合了两个概念,至少在问题中,可能不在你的应用程序中。您有一个使用acts_as_tree建模的类别列表。这支持子类别。标签不应属于子类别。您希望按标签和类别过滤或多或少。您应该能够编写返回文章列表的简单查询,例如:

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

我用过的另一种复杂方法是​​使用Solr进行分面导航。它支持将这些过滤器与全文搜索相结合。

答案 1 :(得分:0)

马特,非常感谢!这看起来比我原先想象的要简单得多。

但是,我的目标是在导航中包含子类别。我们的想法是,父类别将包含子类别中的所有内容,如果您单击子类别,它将缩小范围。我想我会查看Solr的想法,看看它是否使我的代码更简单。

经过一些试验和错误,我得到了我的代码。虽然看起来很乱。有关简化的任何建议吗?

BTW其中一些方法是通过AATOS定义的

在类别视图中#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 %>

对于标签/导航边栏,我有:

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

类别模型,(不理想,但有效)

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

最后丑陋的控制器代码:

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

它可以工作,但它又是丑陋而脆弱的代码。我敢肯定我在这里犯了一些可怕的罪。任何有关清理的建议都表示赞赏。