【问题标题】:Category tree in sinatra and activerecord?sinatra和activerecord中的类别树?
【发布时间】:2011-07-09 11:12:06
【问题描述】:

我正在尝试使用 sinatra 和 activereord(使用 sinatra-activerecord gem)创建一个在线商店,但我在理解如何生成类别“树”(子类别和其他东西)时遇到了一些麻烦)。

分类数据库只包含分类名称和parent_id,activrecord模型如下:

 class Category < ActiveRecord::Base
   validates_presence_of :name
   validates_uniqueness_of :name

   has_many :sub_categories, :class_name => 'Category',
     :foreign_key => 'parent_id', :dependent => :destroy
   has_many :products, :dependent => :destroy
   belongs_to :parent_category, :class_name => 'Category'
 end

我将如何制作我可以在模板中作为嵌套 ul 标记的东西(如果有区别,我会使用 haml)?

很抱歉问了这么多,但我从来没有真正使用过这类数据结构。

【问题讨论】:

  • 不应该是这样的:@sub = Category.find(...).sub_categories 并在模板中遍历@sub 以显示每个子类别。我不太确定,因为我没有使用 ActiveRecord
  • @daddz:我打算这样做,但这将其限制在有限数量的子类别中。我宁愿拥有它,这样多少类别都没关系(我认为这意味着我想要一种递归的东西,但我不确定)
  • 只列出当前“选定”类别的子类别不是更聪明吗?我想您的类别深度越高,请求所需的时间就越长,因为它每次都必须遍历所有子类别。
  • 我想要一个完整的嵌套 ul 树菜单类型的东西。有 javascript 手风琴类型的东西可以隐藏子菜单和东西。我想我可能已经找到了一种方法来使用 haml 助手做我想做的事......我们会看看我该怎么做
  • 我想通了!只要 Stack Overflow 允许,我就会发布它

标签: ruby activerecord sinatra


【解决方案1】:

我想通了。如果存在current_page,它使用HAML 帮助器并且还将current 类应用于正确的元素。这是帮手

module Haml::Helpers
  def categories_menu(parent=nil, current_page=false)
    categories = Category.where(:parent_id => parent)
    haml_tag :ul do
      categories.each do |category|
        haml_tag :li, :class => ("current" if current_page == category.id) do
          haml_tag :a, :href => "/category/#{category.id}", :class => ("submenu" unless category.sub_categories.empty?) do
            haml_concat(category.name)
          end
          unless category.sub_categories.empty?
            categories_menu(category.id)
          end
        end
      end
    end
  end
end

你在一个haml模板中使用它如下:

#test
    - categories_menu(nil, (@category.id if defined? @category))

不保证它可以与其他任何人的应用一起使用。

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 2015-06-23
    • 2013-05-17
    • 1970-01-01
    • 2014-07-10
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多