@saverio成功回答了Tagging from Scratch: the Tag Cloud Issue
上的这个数据库查询问题现在我正在尝试将标记系统与jQuery-tokenInput连接到创建和查找标记,与http://railscasts.com/episodes/258-token-fields-revised一样动态连接。
//= require jquery.tokeninput
遵循所有相关范围:
pictures.js.coffee
jQuery ->
$('#picture_tag_tokens').tokenInput '/tags.json'
theme: 'facebook'
prePopulate: $('#picture_tag_tokens').data('load')
/views/pictures/_form
<div class="field">
<%= f.label :tag_tokens, "Tags (separated by commas)" %><br />
<%= f.text_field :tag_tokens, data: {load: @picture.tags} %>
</div>
这里我的逻辑有点丢失
/models/picture.rb
class Picture < ActiveRecord::Base
attr_accessible :description, :title, :tag_tokens
has_many :taggings
has_many :tags, through: :taggings
attr_reader :tag_tokens
#The **below** is the relevant part for the #view/pictures/_form
def tag_tokens=(tokens)
self.tag_ids = Tag.ids_from_tokens(tokens)
end
def self.tagged_with(name)
Tag.find_by_name!(name).pictures
end
def self.tag_counts
Tag.select("tags.*, count(taggings.tag_id) as count").
joins(:taggings).group("tags.id")
end
def tag_list
tags.map(&:name).join(", ")
end
def tag_list=(names)
self.tags = names.split(",").map do |n|
Tag.where(name: n.strip).first_or_create!
end
end
end
下面我可以看出我无法查询数据库
/models/tag.rb
class Tag < ActiveRecord::Base
attr_accessible :name
has_many :taggings
has_many :pictures, through: :taggings
def self.tokens(query)
tags = where("name like ?", "%#{query}%")
if tags.empty?
[{id: "<<<#{query}>>>", name: "New: \"#{query}\""}]
else
tags
end
end
def self.ids_from_tokens(tokens)
tokens.gsub!(/<<<(.+?)>>>/) { create!(name: $1).id }
tokens.split(',')
end
end
我设置我的标签控制器行为的方式也是如此
#controllers/tags_controller.rb
class TagsController < ApplicationController
def index
@tags = Tag.all
respond_to do |format|
format.html
format.json { render json: @tags.tokens(params[:q]) }
end
end
end
那么,为什么我无法查询Postgresql而我无法动态创建或查找?
答案 0 :(得分:1)
我合并了一个非常简单的解决方案:使用Gem ActsAsTaggableOn和jQuery Tokeninput
如果你仔细阅读下面的算法,你会发现上面的问题只是对Tag System和jQuery之间配置的误解。以下步骤将帮助您走上正轨:
1将jQuery Tokeninput文件放在正确的位置:
Vendor > assets > javascripts > jquery-tokeninput.js
Vendor > assets > stylesheets > token-input-facebook.css (and 2 others)
2在// = require_tree之前的这一行。 这使javascript工作
apps > assets > javascripts > application.js
//= require jquery.tokeninput
wright中的文件上有<3>。 这使css工作
apps > assets > stylesheets > application.css.scss
4将*= require token-input-facebook
放在gem 'acts-as-taggable-on'
上,然后运行捆绑安装,并执行与here完全相同的步骤。
5在gemfile
中为标记控制器索引(我们即将定义)创建一个coustom路由以启用json属性
routes.rb
6运行get '/tag.json', to: 'tag#index', as: :pictures_tags
并在此文件上运行以下内容:
rails g tag controller index
def index
#tag_controller.rb
端
7最后将所有代码粘贴到 query = params[:q]
query = query.chomp(" ").downcase
@tags = ActsAsTaggableOn::Tag.where("tags.name LIKE '%#{query}%' OR tags.name LIKE '#{query}'")
if @tags.empty?
ActsAsTaggableOn::Tag.find_or_create_by_name_and_id(id: "#{query}", name: "#{query}")
else
respond_to do |format|
format.html
format.json { render json: @tags.collect{ |tag| {id: tag.name, name: tag.name } } }
end
end
app > assets > javascript > your_file_with_tags.js.coffee
jQuery - &gt;
#your_file_with_tags.js.coffee
$('#field_with_tag_list').tokenInput '/tag.json'
theme: 'facebook'
prePopulate: $('#field_with_tag_list').data('load')
preventDuplicates: true
resultsLimit: 3
tokenLimit: 7
tokenDelimiter: ","
searchingText: "hit space for New Tag"
<div class="field">
`<%= f.label :tag_list %><br />`
`<%= f.text_field :tag_list, data: {load: @picture.tag_list.map {|tag| { id: tag, name: tag }}} %>`
答案 1 :(得分:0)
试试你的控制器:
@tags = Tag.order(:name)
就是这样。