ruby on rails - Jquery-tokeninput और अधिनियमों के रूप में-टैग-योग्य का उपयोग कैसे करें




ruby-on-rails ruby-on-rails-3 (4)

इस तरह आप jQuery टोकनइनपुट और एटेट्सटैगएबलऑन के साथ स्वत: पूर्ण का उपयोग करते हैं।

मेरी परिस्थिति में मैं नेस्टेड फॉर्म का उपयोग कर रहा हूं लेकिन इससे कोई फर्क नहीं पड़ता सब कुछ नीचे कोड है जो काम करता है

कोड

उत्पाद नमूना:

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

Application.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 का भी उपयोग कर सकते हैं और आपको फॉर्म को बदलना भी नहीं है

नीचे दिए गए दो मुद्दे हैं कि आपको यह करने के लिए क्यों आवश्यक है:

मेरे पास निम्न Tag : {"id":1,"name":"Food"} । जब मैं किसी Product सहेजता हूं, तो उसे "Food" टैग किया जाता है, इसे ID: 1 रूप में सहेजना चाहिए ID: 1 जब यह खोजता है और उसका नाम "Food" मिलता है वर्तमान में, यह एक नया आईडी को एक नया आईडी के साथ बचाता है जो "Food" आईडी का संदर्भ देता है, अर्थात {"id":19,"name":"1"} । इसके बजाय, यह आईडी खोजना चाहिए, नाम दिखा रहा है, और एक find_or_create_by करके कर रहा है, इसलिए यह एक नया Tag नहीं बनाएगा

समस्या 2 (हल)

जब मैं products/show जाता हूं products/show करता हूं तो <%= @product.tag_list %> करके टैग देखने के लिए। नाम " टैग: 1 " के रूप में दिखाई देता है, जब यह वास्तव में " टैग: खाद्य " होना चाहिए

मैं इन मुद्दों को कैसे ठीक कर सकता हूं?


मुझे नहीं पता कि यह आपकी पूरी त्रुटि है, लेकिन आप टोकनइनपॉप प्लगइन के साथ उचित यूआरएल नहीं मार रहे हैं।

इस

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

होना चाहिए

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

जैसा कि मैंने कहा था, मुझे नहीं पता कि यह आपके लिए एकमात्र समस्या है, लेकिन अगर आप इसे बदलते हैं, तो क्या यह काम करता है?

संपादित करें:

मैंने कभी भी ActsAsTaggableOn इस्तेमाल नहीं किया क्या यह आपके लिए उपयोग करने के लिए एक Tag मॉडल बना सकता है?

अगर आप सभी टैग पूछना चाहते हैं, तो आप इसे सिर्फ Tag लिए विरोध कर सकते हैं, जिसका अर्थ है ActsAsTaggableOn::Tag । उदाहरण के लिए, आप देख सकते हैं कि कैसे वे कुछ विशिष्ट ऐप में Tag उपयोग करते हैं


आपको अपने मार्गों में एक मार्ग को परिभाषित करना चाहिए। routes.rb को products/tags पथ को संभालना चाहिए। आप इसे परिभाषित कर सकते हैं:

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

इस प्रकार आपको एक tags_path देना चाहिए जो कि /products/tags मूल्यांकन करना चाहिए। आपको उन त्रुटियों से छुटकारा पाना चाहिए जो आपने सवाल में उल्लिखित किए थे। resources :product को परिभाषित करने से पहले इस मार्ग को जोड़ना सुनिश्चित करें resources :product अपने मार्गों में resources :productroutes.rb

अब कार्य-ए-टैग-ऑन पर , मैंने इस मणि का इस्तेमाल नहीं किया है, लेकिन आपको विधि all_tag_counts दस्तावेज़ देखना चाहिए। आपके ProductsController#tags विधि को निम्न पंक्तियों में कुछ बदलाव की आवश्यकता होगी मुझे यकीन नहीं है कि इसके बिल्कुल क्या आवश्यक होगा, क्योंकि मैं मोगॉयड का उपयोग करता हूं और इसे परीक्षण नहीं कर सकता।

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

उदाहरण के लिए मॉडल को मान्य करने में विफल होने पर मुझे टैग संपादन करने में समस्याएं थीं,

मैं बदल गया

<%= 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 %>

यदि फ़ॉर्म पहले सबमिशन पर मान्य करने में विफल रहा है, तो वह टैग्स का टैग के रूप में बना रहा था, जिसने इसके बाद की प्रस्तुतियाँ बनाई थी।


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
});




acts-as-taggable-on