0

@saverio是成功的在回答關於Tagging from Scratch: the Tag Cloud Issue從頭標記:在查詢數據庫問題

現在我想的標籤系統與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和我不能夠創建查找動態?

回答

1

我成立的解決方案,是很容易:使用寶石ActsAsTaggableOnjQuery Tokeninput

如果你去通過下面的算法,你會找出上面的問題只是一個關於標籤系統之間的配置誤解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。 這使apps > assets > stylesheets > application.css.scss賴特對文件的JavaScript工作

//= require jquery.tokeninput

前3 * = require_tree。 這讓CSS工作

*= require token-input-facebook

4將gem 'acts-as-taggable-on'gemfile和運行捆綁安裝和非常相同的步驟here

5使routes.rb一個coustom路線標籤控制器指數(我們即將定義),以使JSON財產

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

下面的代碼和上面我們可以正確的好好的談一次到數據庫

6運行一個rails 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是在視圖(usualy _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>

所有這些實驗的代碼,我敢肯定,這將有助於你=]

0

試着在你的控制器:

@tags = Tag.order(:name) 

就這樣。