2011-03-04 16 views
30

Tengo un formulario en mi Ruby on aplicación Rails3 con un menú desplegable, esto es mi código actual para la opción de selección:Rails 3: f.select - options_for_select

<%= f.select :phone_type, options_for_select(["Select One", "Cell", "Work", "Office", "Home", "Other"],:disabled => ["Select One"]), :class => 'genForm_dropBox' %> 

Desde mi entender esto debe tener " Seleccione Uno como la opción predeterminada cuando alguien abre la página, pero si no seleccionan una de las otras opciones, aparece un error cuando presionan enviar.

Esto es cierto en los navegadores como Safari y Chrome e IE7, pero en Firefox e IE8 muestra "Celda" como la primera opción como Seleccionar uno está deshabilitado.

Me gustaría que muestre "Seleccionar uno" de forma predeterminada, pero tenerlo como una opción inutilizable cuando envían el formulario. ¿Debo guiar esto al controlador o modelo? o tengo este código en la forma incorrecta?

Respuesta

29

para aquellos que buscan incorporar esta característica, he tomado un nuevo enfoque desde el final del modelo. Como todos los campos deben rellenarse para que el usuario pueda enviar y no reciba una alerta de error, le di a la opción "Enviar uno" un valor predeterminado de nada. Puedes echar un vistazo al siguiente código para ver cómo lo hice.

<%= f.select :phone_type, options_for_select([["Select One", ""], "Cell", "Work", "Office", "Home", "Other"]), :class => 'genForm_dropBox' %> 
+3

creo que también podría tener ': prompt => "Seleccione Uno"' o ': include_blank => "Seleccione Uno" 'justo en el selecto, no estoy seguro si funciona with options_for_select though – GiH

+0

': prompt =>' no funcionó para mí usando options_for select, pero ': include_blank =>' did. – bigtex777

1

Al agregar el ["Seleccionar uno", ""], la pantalla de edición siempre muestra "Seleccionar uno" en lugar del valor almacenado. Rails 3.1 (2012) 17 Agosto

19

Esto es un poco más limpio:

<%= f.select :phone_type, [ 'Cell', 'Work', 'Office', 'Home', 'Other' ], :prompt => 'Select One' %> 

El: argumento pronta genera una opción con un valor vacío.

+0

lo que también es bueno acerca de 'prompt' es que solo se le solicita cuando no ha seleccionado algo.Si editas tu phone_type y ya tienes un conjunto de valores, solo puedes cambiarlos, pero no volver a establecerlo en blanco :) – MMachinegun

10

En Rails 4, este enfoque funciona bien para mí.

<%= f.select :status, options_for_status, {}, prompt: 'Select One' %> 

Mientras tanto, he definido las opciones en un ayudante para mantener el desorden fuera de mi vista.

def options_for_status 
    [ 
    ['First Option','first_option'], 
    ['Second Option','second_option'] 
    ] 
end 
3

Gracias a todos los que contribuyeron con una respuesta.

Necesitaba un código similar para un proyecto en el que estoy trabajando y realmente me gustó el enfoque que tomó Ryan Burnette.

Esto es lo que funcionó para mí usando Rails 4.1.0.

<%= f.select :season, options_for_seasons, :prompt => 'Select One' %> 

Luego definí las opciones en mi ayuda.

def options_for_seasons 
    ['Spring', 'Summer', 'Autumn', 'Winter'] 
end 

Fui con :prompt => 'Select One' porque yo sólo quería la opción "Seleccionar uno" que se enumeran en el formulario de edición, si no hubiera sido seleccionado previamente una temporada.

0

podría ser <%= f.select :phone_type, options_for_select(["Cell", "Work", "Office", "Home", "Other"]), :prompt => "Select One", :class => 'genForm_dropBox' %>