14

これは、jQuery TokeninputActsAsTaggableOnでオートコンプリートを使用する方法です。

私の状況では、ネストされたフォームを使用していますが、問題ではありません。以下はすべて動作するコードです。

コード

製品モデル:

attr_accessible :tag_list # i am using the regular :tag_list
acts_as_taggable_on :tags # Tagging products

製品コントローラー:

  #1. Define the tags path
  #2. Searches ActsAsTaggable::Tag Model look for :name in the created table.
  #3. it finds the tags.json path and whats on my form.
  #4. it is detecting the attribute which is :name for your tags.

def tags 
  @tags = ActsAsTaggableOn::Tag.where("tags.name LIKE ?", "%#{params[:q]}%") 
  respond_to do |format|
    format.json { render :json => @tags.map{|t| {:id => t.name, :name => t.name }}}
  end
end

ルート:

# It has to find the tags.json or in my case /products/tags.json
get "products/tags" => "products#tags", :as => :tags

アプリケーション.js:

$(function() {
  $("#product_tags").tokenInput("/products/tags.json", {
    prePopulate:       $("#product_tags").data("pre"),
    preventDuplicates: true,
    noResultsText:     "No results, needs to be created.",
    animateDropdown:   false
  });
});

形:

<%= p.text_field :tag_list,
                 :id => "product_tags",
                 "data-pre" => @product.tags.map(&:attributes).to_json %>

問題1(解決済み)


次の行が必要です。

format.json { render :json => @tags.collect{|t| {:id => t.name, :name => t.name }}}

注 -@tags.mapここでも使用でき、フォームを変更する必要もありません。

以下は、これを行う必要がある理由に関する2つの問題です。

私は次のものを持っていますTag{"id":1,"name":"Food"}Productタグ付けされた を保存すると、名前を検索して見つけたときに保存"Food"する必要があります。現在、ID を参照する新しい ID を持つ新しい を保存します。代わりに、ID を検索し、名前を表示し、新しい を作成しないようにする必要があります。ID: 1"Food"Tag"Food"{"id":19,"name":"1"}find_or_create_byTag


問題2(解決済み)


products/showを実行してタグを見に行くと<%= @product.tag_list %>。名前は「Tags: 1」と表示されますが、実際には「Tags: Food」である必要があります。

これらの問題を解決するにはどうすればよいですか?

4

6 に答える 6

5

routes.rbパスを処理するルートを定義する必要がありproducts/tagsます。次のように定義できます。

get "products/tags" => "products#tags", :as => :tags

したがって、 にtags_path評価されるヘルパーを提供する必要があります/products/tags。これにより、質問で言及したエラーが取り除かれます。で定義する前に、必ずこのルートを追加resources :productしてください。routes.rb

act-as-taggable-on について説明します。私はこの gem を使用していませんが、メソッドall_tag_counts のドキュメントを参照してください。このメソッドProductsController#tagsでは、次の行でいくつかの変更が必要になります。私はMongoidを使用していてテストできないため、正確に何が必要かどうかはわかりません。

def tags
  @tags = Product.all_tag_counts.(:conditions => ["#{ActsAsTaggableOn::Tag.table_name}.name LIKE ?", "%#{params[:q]}%"])
  respond_to do |format|
    format.json { render :json => @tags.collect{|t| {:id => t.name, :name => t.name } }
  end  
end
于 2011-07-18T13:03:07.230 に答える
4

小さなアドオン:

その場でタグを作成したい場合は、コントローラーでこれを行うことができます。

 def tags
    query = params[:q]
    if query[-1,1] == " "
      query = query.gsub(" ", "")
      Tag.find_or_create_by_name(query)
    end

    #Do the search in memory for better performance

    @tags = ActsAsTaggableOn::Tag.all
    @tags = @tags.select { |v| v.name =~ /#{query}/i }
    respond_to do |format|
      format.json{ render :json => @tags.map(&:attributes) }
    end
  end

これにより、スペースバーが押されるたびにタグが作成されます。

次に、この検索設定をjqueryスクリプトに追加できます。

noResultsText: 'No result, hit space to create a new tag',

少し汚れていますが、私にはうまくいきます。

于 2011-11-23T00:11:09.320 に答える
4

Application.js コードにバグがあります。「/products/tags.json」の後に余分な ) があります。余分なものを削除します)。コードは次のようになります。

$("#product_tags").tokenInput("/products/tags.json", {
    prePopulate:       $("#product_tags").data("pre"),
    preventDuplicates: true,
    noResultsText:     "No results, needs to be created.",
    animateDropdown:   false
});
于 2011-10-15T08:59:03.617 に答える
1

これがエラー全体かどうかはわかりませんが、tokenInput プラグインで適切な URL にアクセスしていません。

これ

$("#product_tag_list").tokenInput("/products/tags.json"), {

する必要があります

$("#product_tag_list").tokenInput("/products.json"), {

私が言ったように、これがあなたが抱えている唯一の問題かどうかはわかりませんが、これを変更するとうまくいきますか?

編集:

私は一度も使用したことがありませんActsAsTaggableOn。使用するモデルを作成しTagますか?

githubの外観から、すべてのタグを照会したい場合は、単にTag、つまりActsAsTaggableOn::Tag. たとえば、いくつかの仕様Tagで s に直接アクセスする方法を確認できます。

于 2011-07-13T17:16:14.893 に答える
1

たとえば、モデルの検証に失敗した場合、タグの編集に問題がありました。

私が変更され

<%= p.text_field :tag_list,
             :id => "product_tags",
             "data-pre" => @product.tags.map(&:attributes).to_json %>

<%= p.text_field :tag_list, 
             :id => "product_tags", 
             "data-pre" => @product.tag_list.map {|tag| {:id => tag, :name => tag } }.to_json %>

フォームが最初の送信で検証に失敗した場合、その後の送信で作成したタグの ID としてタグを作成していました。

于 2011-12-13T22:02:49.557 に答える