Aquí hay un fragmento de código que estoy usando ahora:
<%= f.select :project_id, @project_select %>
¿Cómo modificarlo para que su valor predeterminado sea igual a params[:pid]
cuando se carga la página?
Aquí hay un fragmento de código que estoy usando ahora:
<%= f.select :project_id, @project_select %>
¿Cómo modificarlo para que su valor predeterminado sea igual a params[:pid]
cuando se carga la página?
Respuestas:
Esto debería hacerlo:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
es mejor manera. Es bueno para cualquier situación, bueno para editar formularios también.
Use el atributo correcto de la instancia actual (por ejemplo @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
. Gracias, realmente me ayudó también.
options_for_select(..., f.object.project_id )
El problema con todas estas respuestas es que establecen el campo en el valor predeterminado, incluso si está intentando editar su registro.
Debe establecer el valor predeterminado en su valor existente y luego solo establecerlo en el valor predeterminado real si no tiene un valor. Al igual que:
f.select :field, options_for_select(value_array, f.object.field || default_value)
Para cualquier persona que no esté familiarizada con f.object.field
usted, use siempre y f.object
luego agregue su nombre de campo al final de ese.
select2
complemento JS. Funciona perfectamente si está creando o editando registros con el mismo formulario y usando select2, especialmente con texto de marcador de posición.
Prueba esto:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
no funcionó, pero su ejemplo sí.
si params [: pid] es una cadena, que si proviene de un formulario, es probable que necesite usar
params[:pid].to_i
para seleccionar el elemento correcto en la lista de selección
@project
variable con una identificación de la tabla de la base de datos, en lugar de un título, este código funcionó adjunto en la parte posterior del form.select
ayudante: selected: @project
Gracias @danengle
He encontrado una solución y descubrí que no tengo mucha experiencia en RoR.
Dentro del controlador que administra la vista descrita anteriormente, agregue esto:
@work.project_id = params[:pid] unless params[:pid].nil?
No pude hacer que esto funcionara y descubrí que necesitaba agregar el atributo html "seleccionado" no solo a la <option>
etiqueta correcta sino también a la <select>
etiqueta. Los documentos de MDN en el atributo seleccionado de la etiqueta select dicen:
selected : el atributo booleano indica que se puede seleccionar inicialmente una opción específica.
Eso significa que el código debería verse así:
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
Alternativamente, puede establecer el atributo: project_id en el controlador, ya que el primer argumento de f.select extrae ese atributo en particular.
Si intenta imprimir el objeto f, verá que hay un objeto f.que se puede probar para obtener el elemento seleccionado (aplicable para todas las versiones de rieles> 2.3)
logger.warn("f #{f.object.inspect}")
entonces, use el siguiente script para obtener la opción seleccionada adecuada:
:selected => f.object.your_field
Ya está explicado, intentará dar un ejemplo
deja que la lista de selección sea
select_list = { eligible: 1, ineligible: 0 }
Entonces, el siguiente código da como resultado
<%= f.select :to_vote, select_list %>
<select name="to_vote" id="to_vote">
<option value="1">eligible</option>
<option value="0">ineligible</option>
</select>
Entonces, para hacer una opción seleccionada por defecto, tenemos que usar selected: value .
<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>
if can_vote? devuelve verdadero, establece seleccionado: 1, luego se seleccionará el primer valor, de lo contrario será el segundo.
select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
<option value="1">eligible</option>
<option selected="selected" value="0">ineligible</option>
</select>
si las opciones de selección son solo una lista de matriz en lugar de hast, entonces lo seleccionado será solo el valor a seleccionar, por ejemplo si
select_list = [ 'eligible', 'ineligible' ]
ahora el seleccionado solo tomará
<%= f.select :to_vote, select_list, selected: 'ineligible' %>
La respuesta anterior de Mike Bethany funcionó para establecer un valor predeterminado cuando se creaba un nuevo registro y todavía tenía el valor que el usuario seleccionado mostraba en el formulario de edición. Sin embargo, agregué un modelo de validación y no me permitió enviar el formulario. Esto es lo que funcionó para mí para tener una validación de modelo en el campo y mostrar un valor predeterminado, así como el valor que el usuario seleccionó cuando estaba en modo de edición.
<div class="field">
<%= f.label :project_id, 'my project id', class: "control-label" %><br>
<% if @work.new_record? %>
<%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
<% else %>
<%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
<% end %>
</div>
Modelo de validación
validates :project_id, presence: true
Esto debería funcionar para ti. Simplemente pasa {:value => params[:pid] }
a la variable html_options.
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>