我要构建的功能是使用jquery-ui菜单小部件的标签菜单。这将用于搜索目的。我想让它们都成为Tag模型中的对象,但是我很难绕过如何在模型中建立层次结构。
例如,夜生活=> restaurants =>海鲜,这三种都是标签模型物品,海鲜是一种餐馆,餐馆是一种夜生活。
jquery-ui菜单小部件的示例代码是硬编码的,但显然我想用.erb创建它,能够在Tag模型中创建关联,所以这样我就可以创建一个不同类型的餐厅比如牛排馆,它会在模型内和标签层次结构中正确关联。
不确定如何做到这一点。
答案 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