2009-06-09 21 views
8

estoy escribiendo un formulario de petición Ajax con Ruby on Rails usando una etiqueta collection_select que tiene este aspecto:cómo anular [] corchetes en ruby?

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

Rubí entonces construye un selecto etiqueta HTML con id = "Jobs_clearance" y name = "Jobs[clearance]"

Quiero enviar el parámetro a mi controlador, que se ve así:

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

Desafortunadamente, Ruby sólo lee ":Jobs" como el símbolo en lugar de ":Jobs[clearance]"
¿Hay alguna manera de escapar del []? la barra invertida no funciona.

Respuesta

10

Es necesario utilizar params[:Jobs][:clearance]

params es un hash de todos los parámetros de la petición. Pero params[:Jobs] es TAMBIÉN un hash de todos: Parámetros de trabajos. Entonces, llamar al params[:Jobs][:clearance] llama al método [] en el objeto params[:Jobs] pasando :clearance como parámetro.

+1

funcionó como un encanto. Gracias kmorris! –

49

kmorris resolvió su problema (muy bien) pero me gustaría responder su pregunta: puede anular [] y [] = operadores porque son métodos (como casi todo), pero debe pensar bien acerca de lo que están haciendo porque puedes romper toneladas de cosas.

class AntiArray < Array 

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

end 

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

y[1] 

=> 4 
+5

+1: esto es importante saber – TomZ

+0

¿Cómo hacerlo para que 'y [1] = 5' funcione? – Gherman

0

@Alemán, intentado obtener una respuesta para su pregunta.

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 > 

Espero que esto es lo que está pidiendo. Dado un intento para usted