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

十分に簡単なソリューションを組み込みました:jQueryTokeninputGemActsAsTaggableOnを使用する

以下のアルゴリズムを実行すると、上記の質問はタグシステムとjQueryの間の構成に関する単なる誤解であることがわかります。次の手順は、あなたの道に役立ちます:

1jQueryTokeninputファイルを適切な場所に配置します。

Vendor > assets > javascripts > jquery-tokeninput.js

Vendor > assets > stylesheets > token-input-facebook.css (and 2 others)

apps > assets > javascripts > application.js//=require_treeの前のこの行のライトのファイルの2 。これにより、JavaScriptが機能します

//= require jquery.tokeninput

apps > assets > stylesheets > application.css.scss*=require_treeの前のwrightのファイルの3 。これにより、CSSが機能します

*= require token-input-facebook

4を装着しgem 'acts-as-taggable-on'バンドルインストールgemfileを実行し、こことまったく同じ手順を実行します。

routes.rb5 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は、次のようにタグを代入するために生成するビュー(通常は_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 に答える