2012-02-27 9 views
10

आइए कहें कि मैं एक ऐसा पृष्ठ बनाना चाहता हूं जो वांछित ऑब्जेक्ट को प्रकार (स्ट्रिंग) और आईडी (int) से क्वेरी कर सके।स्टिंग इनपुट के साथ मॉडल का संदर्भ

/क्वेरी? Type = लोग & आईडी = 1

मुझे लाने होगा

Person.find (1)

जबकि

/कुए ry? type = शहरों & आईडी = 123

मुझे लाने होगा

City.find (123)

हालांकि, मैं समस्याओं कैसे वांछित में स्ट्रिंग का अनुवाद करने के लिए के रूप में है मॉडल वर्ग

एक ही रास्ता मैं के बारे में सोच सकते हैं

case params[:type] 
when 'people' 
    @object = Person.find(params[:id]) 
when 'cities' 
    @object = City.find(params[:id]) 
end 

हालांकि है, इस पद्धति काफी समस्याग्रस्त अगर मैं मॉडल के अधिक प्रकार है किया जाएगा।

क्या कोई बेहतर तरीका है?

अग्रिम धन्यवाद,

+3

आप एक स्थिति में दिखाई दे सकती आप स्वचालित रूप से ऐसा करने की कोशिश जहां एक हमलावर भेज सकते हैं "/query? type = TOP_SECRET_TABLE और id = 1 "और जानकारी प्राप्त करें जिसे उसे एक्सेस करने की अनुमति नहीं दी जानी चाहिए। आप जो चाहते हैं उससे सावधान रहें। – Sebi

+0

यह वास्तव में टैगिंग ऑब्जेक्ट्स के लिए AJAX के लिए है। तो मेरा अगला कदम @ object.tags << टैग जैसा होगा। लेकिन सवाल को सरल रखना चाहते थे इसलिए इस तरह से पूछा गया। फिर भी धन्यवाद! – rickypai

उत्तर

37

प्रयास करें:

klass = params[:type] 
klass.singularize.classify.constantize.find(params[:id]) 

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

@object = params[:type].singularize.classify.constantize.find(params[:id]) 
+0

आपका कोड बॉक्स से बाहर काम नहीं करता है, लेकिन मैंने संपादित किया है और अब यह काम करता है! आपका बहुत बहुत धन्यवाद! – rickypai

+0

हाँ, एक टाइपो 'टाइप' से 'क्लास', धन्यवाद। –

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