0

@saverio 成功回答了关于从头开始标记的数据库查询问题:标签云问题

现在我正在尝试将标记系统与 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

<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 并且无法动态创建查找

4

2 回答 2

1

我合并了一个非常简单的解决方案:使用带有jQ​​uery Tokeninput的 Gem ActsAsTaggableOn

如果你通过下面的算法,你会发现上面的问题只是对 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.jswright 这一行之前的文件中 //= require_tree 。这使javascript工作

//= require jquery.tokeninput

3 在apps > assets > stylesheets > application.css.scss*= require_tree 之前的 wright 文件中。这使CSS工作

*= require token-input-facebook

4gem 'acts-as-taggable-on'安装gemfile并运行bundle install和与此处相同的步骤

routes.rb5为标签控制器索引(我们即将定义)创建一个自定义路由以启用 json 属性

get '/tag.json', to: 'tag#index', as: :pictures_tags

以下代码和上面的代码允许我们正确地与数据库交谈

6 运行 arails g tag controller index并在此文件上写入以下内容:

#tag_controller.rb

定义索引

     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 在您的视图中(通常是 _form 部分),您可以生成这样的标签: (#controller_tag_list) 即 #pictures_tag_list

<div class="field">

`<%= f.label :tag_list %><br />`

`<%= f.text_field :tag_list, data: {load: @picture.tag_list.map {|tag| { id: tag, name: tag }}} %>`

</div>

所有这些都是经过实验的代码,我相信这会对你有所帮助 =]

于 2012-10-13T07:12:54.203 回答
0

在您的控制器上尝试:

  @tags = Tag.order(:name)

就这样。

于 2012-11-22T06:28:46.127 回答