从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) 

就这样。