从Scratch标记:查询数据库问题
@saverio成功回答了关于从Scratch标记的数据库查询问题:标签云问题
现在我正在尝试将标记系统与jQuery-tokenInput连接到动态创建和查找标签,如http://railscasts.com/episodes/258-token-fields-revised 。
- 我的猜测是Posgresql数据库的查询问题。
- 我已经正确安装了Postgresql
- jQuery-tokenInput位于Application.js
//= require jquery.tokeninput
- 不知何故,它可以从数据库中已有的标签加载标签,但它无法动态查询下面在pictures.js.coffee代码上列出的相同单词。
遵循所有相关范围:
pictures.js.coffee
jQuery -> $('#picture_tag_tokens').tokenInput '/tags.json' theme: 'facebook' prePopulate: $('#picture_tag_tokens').data('load')
/views/pictures/_form
在这里,我的逻辑有点迷失
/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: "<<>>", 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而我无法动态创建或查找 ?
我收集了一个很容易的解决方案:使用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在apps > assets > javascripts > application.js
文件中,在// = require_tree之前的这行。 这使得javascript工作
//= require jquery.tokeninput
3在apps > assets > stylesheets > application.css.scss
= apps > assets > stylesheets > application.css.scss
wright中的文件之前* = require_tree。 这使得CSS工作
*= require token-input-facebook
4在gem 'acts-as-taggable-on'
放置gem 'acts-as-taggable-on'
并运行bundle install和与此处相同的步骤。
5在routes.rb
为标记控制器索引(我们即将定义)创建一个coustom路由以启用json属性
get '/tag.json', to: 'tag#index', as: :pictures_tags
以下代码和以上代码允许我们正确地适应数据库
6运行rails g tag controller index
并在此文件上运行以下内容:
#tag_controller.rb
def指数
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
结束
7,最后用你将放在app > assets > javascript > your_file_with_tags.js.coffee
上的代码粘贴一切
#your_file_with_tags.js.coffee
jQuery – >
$('#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"
PS:#field_with_tag_list在您的视图中(usualy _form partial),您生成这样的标记,如下所示:(#console_tag_list)ie #pictures_tag_list
`<%= f.label :tag_list %>
` `<%= f.text_field :tag_list, data: {load: @picture.tag_list.map {|tag| { id: tag, name: tag }}} %>`
所有这些都是经过实验的代码,我相信它会帮助你=]
试试你的控制器:
@tags = Tag.order(:name)
就这样。