ruby on rails - Jquery-tokeninput और अधिनियमों के रूप में-टैग-योग्य का उपयोग कैसे करें
ruby-on-rails ruby-on-rails-3 (4)
मुझे नहीं पता कि यह आपकी पूरी त्रुटि है, लेकिन आप टोकनइनपॉप प्लगइन के साथ उचित यूआरएल नहीं मार रहे हैं।
इस
$("#product_tag_list").tokenInput("/products/tags.json"), {
होना चाहिए
$("#product_tag_list").tokenInput("/products.json"), {
जैसा कि मैंने कहा था, मुझे नहीं पता कि यह आपके लिए एकमात्र समस्या है, लेकिन अगर आप इसे बदलते हैं, तो क्या यह काम करता है?
संपादित करें:
मैंने कभी भी ActsAsTaggableOn
इस्तेमाल नहीं किया क्या यह आपके लिए उपयोग करने के लिए एक Tag
मॉडल बना सकता है?
अगर आप सभी टैग पूछना चाहते हैं, तो आप इसे सिर्फ Tag
लिए विरोध कर सकते हैं, जिसका अर्थ है ActsAsTaggableOn::Tag
। उदाहरण के लिए, आप देख सकते हैं कि कैसे वे कुछ विशिष्ट ऐप में Tag
उपयोग करते हैं ।
इस तरह आप 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 " के रूप में दिखाई देता है, जब यह वास्तव में " टैग: खाद्य " होना चाहिए
मैं इन मुद्दों को कैसे ठीक कर सकता हूं?
आपको अपने मार्गों में एक मार्ग को परिभाषित करना चाहिए। routes.rb
को products/tags
पथ को संभालना चाहिए। आप इसे परिभाषित कर सकते हैं:
get "products/tags" => "products#tags", :as => :tags
इस प्रकार आपको एक tags_path
देना चाहिए जो कि /products/tags
मूल्यांकन करना चाहिए। आपको उन त्रुटियों से छुटकारा पाना चाहिए जो आपने सवाल में उल्लिखित किए थे। resources :product
को परिभाषित करने से पहले इस मार्ग को जोड़ना सुनिश्चित करें resources :product
अपने मार्गों में resources :product
। routes.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
});