2009-06-09 16 views
8

piszę formularz żądania AJAX z Ruby on Rails przy użyciu collection_select znacznik, który wygląda tak:jak przesłonić [] nawiasy w rubin?

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

Ruby następnie buduje HTML wybierz tag id = "Jobs_clearance" i name = "Jobs[clearance]"

Chcę wysłać parametr do mojego kontrolera, który wygląda tak:

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

niestety tylko Ruby czyta ":Jobs" jako symbol zamiast ":Jobs[clearance]"
Czy istnieje sposób na ucieczkę z []? ukośnik odwrócony nie działa.

Odpowiedz

10

Trzeba użyć params[:Jobs][:clearance]

params jest hash wszystkich parametrów żądania. Ale params[:Jobs] jest RÓWNIEŻ hashem wszystkich: parametrów pracy. Dlatego wywołanie params[:Jobs][:clearance] wywołuje metodę [] na obiekcie params[:Jobs] przekazując jako parametr parametr params[:Jobs][:clearance].

+1

pracował jak urok. Dzięki, kmorris! –

49

kmorris rozwiązał twój problem (bardzo dobrze), ale chciałbym odpowiedzieć na twoje pytanie: możesz przesłonić [] i [] = operatorów, ponieważ są to metody (jak prawie wszystko), ale powinieneś dobrze pomyśleć o tym, co robią, ponieważ możesz złamać mnóstwo rzeczy.

class AntiArray < Array 

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

end 

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

y[1] 

=> 4 
+5

+1: Ważne jest, aby wiedzieć – TomZ

+0

Jak to zrobić, aby "y [1] = 5" mogło działać? – Gherman

0

@Niemiecki, próbowałem uzyskać odpowiedź na twoje pytanie.

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 > 

Mam nadzieję, że o to prosisz. Próbowałem dla ciebie