2009-06-09 17 views
8

मैं पर रूबी के साथ एक अजाक्स अनुरोध फॉर्म लिख रहा हूँ एक collection_select टैग कि इस तरह दिखता है का उपयोग करते हुए:रूबी में [] ब्रैकेट को ओवरराइड कैसे करें?

<%= collection_select("Jobs", "clearance", @allClearances, "clearance", "clearance", {:prompt => "Select a Clearance"})%> 

रूबी तो साथ id = "Jobs_clearance" और name = "Jobs[clearance]"

मैं पैरामीटर भेजना चाहते हैं एक HTML का चयन टैग बनाता है मेरी नियंत्रक है, जो इस तरह दिखता है:

class JobsController < ApplicationController 
    def foo 
    @clearance = params[:Jobs[clearance]] 
    end 

दुर्भाग्य से, रूबी के बजाय केवल ":Jobs" प्रतीक के रूप मेंपढ़ता
[] से बचने का कोई तरीका है? बैकस्लैश काम नहीं कर रहा है।

उत्तर

10

आप का उपयोग करने के params[:Jobs][:clearance]

params सभी अनुरोध मानकों का एक हैश है की जरूरत है। लेकिन params[:Jobs] सभी का एक हैश भी है: जॉब्स पैरामीटर। इसलिए params[:Jobs][:clearance] पर पैरामीटर के रूप में :clearance पर ऑब्जेक्ट [] विधि को कॉल कर रहा है।

+1

आपके लिए एक प्रयास की तरह काम किया। धन्यवाद kmorris! –

49

किमीोरिस ने आपकी समस्या हल की (बहुत अच्छी तरह से) लेकिन मैं आपके प्रश्न का उत्तर देना चाहूंगा: आप [] और [] = ऑपरेटरों को ओवरराइड कर सकते हैं क्योंकि वे विधियां हैं (लगभग सब कुछ की तरह), लेकिन आपको इसके बारे में अच्छी तरह से सोचना चाहिए कर रहे हैं क्योंकि आप कई चीजें तोड़ सकते हैं।

class AntiArray < Array 

    def [](ind) 
    self.fetch(-ind) 
    end 

end 

y = AntiArray.new([1,2,3,4]) 

y[1] 

=> 4 
+5

+1: – TomZ

+0

जानना महत्वपूर्ण है कि इसे कैसे बनाया जाए ताकि 'y [1] = 5' काम करे? – Gherman

0

@German, आपके प्रश्न के उत्तर पाने का प्रयास किया।

2.1.3 :025 > class AntiArray < Array 
2.1.3 :026?>  def [](ind) 
2.1.3 :027?>   self.fetch(-ind) + 1 
2.1.3 :028?>  end 
2.1.3 :029?> end 
=> :[] 
2.1.3 :030 > y = AntiArray.new([1,2,3,4]) 
=> [1, 2, 3, 4] 
2.1.3 :031 > y[1] 
=> 5 
2.1.3 :032 > 

आशा है कि आप यही पूछ रहे हैं।

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