2012-09-13 7 views
8

que tienen una línea como esta:¿Excluir la opción de collection.map en Ruby on Rails?

<%= f.input :state_id, :input_html => {:value => (policy_address.state.name rescue nil)}, :required => true, :collection => states.map {|s| [ s.name, s.id] }, :include_blank => 'Please select'%> 

que desea excluir un valor de la colección states.map. Pensé que esto iba a funcionar pero no es así:

<%= f.input :state_id, :input_html => {:value => (policy_address.state.name rescue nil)}, :required => true, :collection => states.map {|s| [ s.name, s.id] unless s.name == "excluded_state" }, :include_blank => 'Please select'%> 

puse en unless s.name == "excluded_state, pero, de nuevo, que no está funcionando:

¿Qué estoy haciendo mal?

Respuesta

20

map no permite omitir los valores. Primero debes rechazar los elementos no deseados.

states.reject { |s| s.name == "excluded_state" }.map { |s| [s.name, s.id] } 

Otra solución (más sucio) es volver nil para los elementos excluidos y utilizar Array#compact en la matriz resultante para eliminar esos nil elementos:

states.map { |s| s.name == "excluded_state" ? nil : [s.name, s.id] }.compact 
+1

Gracias! funcionó perfectamente – Ryan

+0

Esto es exactamente lo que necesito. Gracias –

+4

'states.map {| s | [s.name, s.id] if s.name == "excluded_state"} .compact' –

6

Eureka's respuesta es buena, pero aquí es sólo una breve explicación para aclarar lo que está pasando.

map devuelve una nueva matriz con los resultados de ejecutar el bloque una vez para cada elemento en la matriz. Cuando se escribe [s.name, s.id] unless s.name == "excluded_state" esto hace que el bloque para volver nil cuando s.name == "excluded_state" es decir, el resultado sería algo así como

[["NY", 1], nil, ["CA", 2]] 

lo que podría utilizar reject para eliminar el estado no deseado en primer lugar, o simplemente podría utilizar compact para eliminar la entrada nil en el resultado de su map como la escribió originalmente.


  1. Array#compact devuelve una copia de la matriz con todos los nil elementos eliminados.
+0

gracias por la explicación, tiene mucho más sentido ahora por qué estaba recibiendo el error que recibí cuando probé lo que hice. – Ryan

+1

Gracias: orden de condición reparado, mi analizador mental corrió demasiado rápido en este caso;) – Eureka