2011-01-15 20 views
15

Tengo el siguiente:rails - collection_select valor seleccionado si está definido?

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => 2 %> 

El problema es que sólo quiero el valor seleccionado de 2 si el valor @ permission.role_id es nula.

así que trataron:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2 if @permission.role_id.nil?} %> 

pero eso hizo que los carriles enojado. ¿Cómo puedo hacer que una condición seleccione un valor basado en si una variable separada es nula o no?

Gracias

Respuesta

23

bien, supongo Me sentiré estúpido en 2 minutos, pero ¿qué pasa con

<%= f.collection_select :role_id, roles, :id, :name, prompt: true, @permission.role_id ? {} : {selected: 2 } %> 

La razón por la que su solución no está funcionando es que su if puede volver nil, para ello busca algo así:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {nil} %> 

Dónde {nil} es error de sintaxis

0

El problema es que no se puede tener un caso en esa posición. Por lo que una primera solución, aunque un poco feo, es algo así como lo siguiente:

<% if @permission.role_id.nil? %> 
    <%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2} %> 
<% else %> 
    <%= f.collection_select :role_id, roles, :id, :name, :prompt => true %> 
<% end %> 
3

poner esto en su ayudante

def selected(permission) 
    if permission.role_id.nil? 
    return 2 
    else 
    ..... 
    end 
end 

y esto, en su opinión

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => selected(@permission) %> 
9

Mientras que la solución aceptada con el operador ternario funciona, no creo que es tan legible como la solución siguiente:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => @permission.role_id || 2 %> 
+0

esto parece fallar con un error nulo si el atributo de objeto es nulo – Rubytastic

+0

envoltura intento ese último valor hash entre paréntesis. ¿Estás usando un intérprete no estándar? : selected => (@ permission.role_id || 2) por lo tanto, si role_id es nil, devuelve 2. – saneshark

0

encontré respuesta de @ ecoologic no funcionó para mí como el rubí trató de interpretar el hash como una clave para un último argumento en lugar de mirar dentro del hash para ver los valores.

La solución fue utilizar un 'splat'. Sin embargo no parecen símbolos de trabajar en ese formato en línea, por lo que utilizan el siguiente:

<% selected = @permission.role_id ? {} : {selected: 2 } %> 
<%= f.collection_select :role_id, roles, :id, :name, prompt: true, **selected %> 
Cuestiones relacionadas