2010-02-13 15 views
7

मुझे एक समस्या है जहां मुझे जीईटी अनुरोध से पास किए गए मूल्यों की आवश्यकता है और मुझे नहीं पता कि रूटिंग परिभाषा कैसे सेट अप करें।क्वेरी स्ट्रिंग के साथ रेल रूटिंग

मेरी श्रेणी ऑब्जेक्ट में एक प्रकार (स्ट्रिंग), एक रंग (स्ट्रिंग) और कई उत्पाद हैं।

http://www.myapp.com/getProducts?catType=toy&color=red 

या: मैं एक सरल वेब सेवा की सुविधा देता है फोन करने वाले श्रेणी के प्रकार और रंग में पास करके एक श्रेणी के उत्पादों के सभी मिलता है बनाना चाहते हैं?

http://www.myapp.com/categories/getProducts?catType=toy&color=red 

मैं इस स्थिति के लिए सही मार्ग कैसे परिभाषित करूं? क्या इसे एक शांत तरीके से करने के बेहतर तरीके हैं ... क्योंकि मुझे पता है कि रेल आराम से है, इसलिए यदि इसे "सही तरीके से" करने का कोई तरीका है तो यह भी बेहतर होगा।

धन्यवाद

उत्तर

11

आपका पहला उदाहरण:

map.getproduct '/getProduct', :controller => 'your_controller', :action => 'your_action' 

नियंत्रक में आप परम हैश में catType और रंग होगा:

params[:catType] 
=> 'toy' 
params[:color] 
=> 'red' 

क्या कोई बेहतर तरीका है? शायद हाँ, लेकिन यह आपकी जरूरतों पर निर्भर करता है। आप हमेशा की तरह, catType और रंग मापदंडों होगा की तुलना में आप इस तरह मार्ग जोड़ सकते हैं:

map.getproduct '/getProduct/:catType/:color', :controller => 'your_controller', :action => 'your_action' 

आप पिछले उदाहरण की तरह पैरामीटर हैश के साथ उन मानकों के लिए उपयोग होगा।और आपके URL इस तरह दिखेगा:

www.myapp.com/getProduct/toy/red 

अपने मानकों को बदल सकते हैं, तो आप मार्ग ग्लोबिंग उपयोग कर सकते हैं:

map.getproduct '/getProduct/*query', :controller => 'your_controller', :action => 'your_action' 

तो यह सब अनुरोध शुरुआत में www.my.app.com/getProduct/... है कि पकड़ लेंगे। लेकिन आपके पास नियंत्रक में अधिक काम होगा। आप इस के साथ query के लिए उपयोग होगा:

params[:query] 

और www.myapp.com/getProduct/color/red/catType/toy के लिए यह दे देंगे:

params[:query] 
=> ['color', 'red', 'catType', 'toy] 

तो तुम यह manualy पार्स करने के लिए की है।

+0

बढ़िया ... बाकी की विधि बिल्कुल वही थी जो मैं चाहता था! जांचें और ऊपर वोट दें। –

+1

मुझे कोई बात नहीं है कि यह आराम से है। वे मार्ग केवल उत्पादों के कुछ संग्रह की खोज करते हैं। @chrisdinn उत्तर अधिक आरामदायक है, लेकिन मुझे लगता है कि खोज मार्गों को आराम करने की आवश्यकता नहीं है। वस्तुओं के कोलेसिटन प्राप्त करने और उन वस्तुओं में से एक के हेरफेर के लिए मुख्य रूप से आराम करना है। लेकिन वैसे भी मुझे खुशी है कि मेरा जवाब सहायक था! – klew

4

यह करने के लिए करने के लिए एक उत्पाद का संसाधन एक वर्ग संसाधन नीचे नेस्ट, इसलिए की तरह शामिल होगा एक RESTful रास्ता:

http://www.myapp.com/categories/toy/products?color=red

आपका routes.rb शामिल करने की आवश्यकता होगी:

map.resources :categories do |category| 
    category.resources :products 
    end 

रूटिंग के लिए श्रेणी के प्रकार विशेषता का उपयोग करने के ऊपर मेरे यूआरएल के बाद से, मैं यह कह रहा हूं कि प्रत्येक प्रकार अद्वितीय है, एक आईडी की तरह इसका मतलब यह होगा कि जब भी आप श्रेणी नियंत्रक (या कहीं और) में एक श्रेणी लोड कर रहे हैं तो आपको के बजाय Category.find_by_type(params[:id]) के साथ श्रेणी लोड करने की आवश्यकता होगी। जब भी संभव हो, मुझे इस तरह रूटिंग श्रेणियां पसंद हैं।

आपका ProductsController नियंत्रक सूचकांक कार्रवाई लाइनों का उपयोग कर उत्पादों मिलेगा चाहते:

@category = Category.find_by_type(params[:category_id]) 
    @products = @category.products.find(:all, :conditions => { :color => params[:color]}) 

याद रखें, आपका श्रेणी मॉडल लाइन होनी चाहिए:

has_many :products 

यह संभव एक अच्छा विचार को लागू करने में है सत्यापन के साथ मॉडल:

validates_presence_of :type 
validates_uniqueness_of :type 

रूटिंग करने के लिए काम आप भी श्रेणी मॉडल में to_param विधि के ऊपर लिख चाहिए आईडी के बजाय प्रकार वापस जाने के लिए:

def to_param 
    self.type 
end 
+2

यह वही नहीं था जो मैं ढूंढ रहा था ... लेकिन मैंने अभी भी आपको एक वोट दिया क्योंकि आपकी पोस्ट सहायक और सूचनात्मक थी। –

संबंधित मुद्दे