Rails标记具有层次结构的类

时间:2014-01-04 23:27:53

标签: jquery ruby-on-rails

我要构建的功能是使用jquery-ui菜单小部件的标签菜单。这将用于搜索目的。我想让它们都成为Tag模型中的对象,但是我很难绕过如何在模型中建立层次结构。

例如,夜生活=> restaurants =>海鲜,这三种都是标签模型物品,海鲜是一种餐馆,餐馆是一种夜生活。

jquery-ui菜单小部件的示例代码是硬编码的,但显然我想用.erb创建它,能够在Tag模型中创建关联,所以这样我就可以创建一个不同类型的餐厅比如牛排馆,它会在模型​​内和标签层次结构中正确关联。

不确定如何做到这一点。

1 个答案:

答案 0 :(得分:0)

您可能希望查看Ancestry gem了解此内容

虽然你需要澄清你引用的“标签”菜单(我认为它是http://jqueryui.com/menu/),但我会解决这个问题:

Creating a model that has a tree structure


<强>系统

你是对的,JQuery需要硬编码(因为它是客户端)

挑战在于将数据导入JQuery函数。要做到这一点,你需要从Rails渲染数据(来自helper - 如果是静态的 - 或模型 - 如果是动态的),然后将它们附加到渲染的页面

db -> model -> helper -> view (JS)

我将举例说明如何使用模型动态填充数据:


<强>模型

假设您拥有Tag模型,可以使用self-referencial association为您的代码创建一组parents。这些父母将允许您定义最高级别的菜单,逐步深入到子级别:

#app/models/tag.rb
Class Tag < ActiveRecord::Base
    belongs_to :parent, class_name: "Tag"
    has_many :children, through: :parent, foreign_key: "parent_id"

    #Gives hierachy
    scope :parents, -> { where(parent_id: nil} ) 
end

这应该允许你加载:

@tag.parents.children

这是未经测试的,所以可能需要调整很多


<强>辅助

助手将能够做到这一点:

#app/helpers/application_helper.rb
def menu_tags
    #This needs fixing to enable hierarchies
    gon.push ({
       tags: Tag.all
    })
end

<强>布局

因为您正在调用Rails数据,所以我使用gem called GON将标签输出为JS可读变量:

#app/views/layouts/application.html.erb
<%= include_gon %> #-> makes gon.tags available to JS


#app/assets/javascripts/application.js
// can call gon.tags & use in JQuery