2009-06-09 13 views
8

sto scrivendo un modulo di richiesta Ajax con Ruby on Rails utilizzando un nome collection_select che assomiglia a questo:come sostituire le parentesi [] in ruby?

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

Rubino poi costruisce un tag select HTML con id = "Jobs_clearance" e name = "Jobs[clearance]"

voglio mandare il parametro al mio controller, che assomiglia a questo:

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

Purtroppo, Ruby legge solo ":Jobs" come il simbolo invece di ":Jobs[clearance]"
C'è un modo per sfuggire allo []? il backslash non funziona.

risposta

10

è necessario utilizzare params[:Jobs][:clearance]

params è un hash di tutti i parametri di richiesta. Ma params[:Jobs] è anche un hash di tutti: parametri di lavoro. Quindi chiamare params[:Jobs][:clearance] chiama il metodo [] sull'oggetto params[:Jobs] che passa a :clearance come parametro.

+1

ha funzionato come un fascino. Grazie mille! –

49

kmorris ha risolto il problema (molto bene) ma vorrei rispondere alla tua domanda: puoi sovrascrivere [] e [] = operatori perché sono metodi (come quasi tutto), ma dovresti pensare bene a quello che stanno facendo perché puoi rompere un sacco di cose.

class AntiArray < Array 

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

end 

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

y[1] 

=> 4 
+5

+1: questo è importante sapere – TomZ

+0

Come fare in modo che 'y [1] = 5' possa funzionare? – Gherman

0

@German, ha cercato di ottenere risposta per la tua domanda.

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 > 

Spero che questo sia quello che stai chiedendo. Provato per voi

Problemi correlati