Ayudante de selección de rieles: valor predeterminado seleccionado, ¿cómo?

182

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?

totocaster
fuente
No estoy seguro de si desea seleccionar un proyecto predeterminado cuando se carga la página, si: project_id no está configurado, o si desea devolver el valor de la selección en el hash de parámetros como: pid.
Tilendor

Respuestas:

223

Esto debería hacerlo:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>
htanata
fuente
55
sin params, options_for_selectes mejor manera. Es bueno para cualquier situación, bueno para editar formularios también.
Adriano Resende
Aquí está la CLAVE: MIRE su función (options_for_select () vs f.select. Recuerde que estas son funciones diferentes.
FlyingV
126

Use el atributo correcto de la instancia actual (por ejemplo @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>
lince
fuente
44
Esta es la mejor respuesta porque también funciona con select_tag. Gracias, realmente me ayudó también.
stephenmurdoch
77
También puedes probaroptions_for_select(..., f.object.project_id )
18agosto
¡Muchas gracias! Todas las otras respuestas aceptadas no dicen cómo seleccionar mediante variable.
Mike Belanger el
52

Carriles 3.0.9

select options_for_select([value1, value2, value3], default)
Cheng
fuente
No pude resolver esta solución hasta que noté su corchete de cierre alrededor de la matriz de valores ANTES de la coma que separa su valor predeterminado ... value3], default
Perdí
33

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.fieldusted, use siempre y f.objectluego agregue su nombre de campo al final de ese.

Mike Bethany
fuente
3
Esa es una solución limpia, y como se mencionó, desea establecer el valor predeterminado solo en el nuevo y el valor actual en la edición.
count0
1
Sé que este es un hilo viejo, pero para cualquiera que lo encuentre, esta respuesta también funciona con el select2complemento JS. Funciona perfectamente si está creando o editando registros con el mismo formulario y usando select2, especialmente con texto de marcador de posición.
cdouble.bhuck
Creo que esta debería ser la aceptada como la Respuesta, como @Mike Bethany dijo que todas las demás respuestas asumieron que el formulario se presenta solo para nuevos registros cuando el enfoque de los rieles es reutilizar el formulario. Felicitaciones Mike
Erick Castrillo
22

Prueba esto:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>
gavit
fuente
Usando Rails 4, params[:pid]no funcionó, pero su ejemplo sí.
Eric Wanchic
Esto funcionó para mí ya que estoy usando un parcial dentro de "f.fields_for" Gracias.
Hugo
11

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

colgar
fuente
Esta respuesta me ayudó a identificar mi problema. Mi cuadro de selección es dinámico y extrae una colección de la base de datos. Intenté completar la selección predeterminada con un título, no con una identificación del elemento. Esta respuesta me ayudó a ver ese problema, y ​​una vez que completé mi @projectvariable 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.selectayudante: selected: @projectGracias @danengle
Christopher Warrington el
10

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?
totocaster
fuente
7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
jschorr
fuente
3

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}
Shelvacu
fuente
2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
swapnilp
fuente
0

Alternativamente, puede establecer el atributo: project_id en el controlador, ya que el primer argumento de f.select extrae ese atributo en particular.

promacuser
fuente
0

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 
usuario2480972
fuente
0

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' %>
shiva kumar
fuente
0

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
random_user_0891
fuente
-2

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] } %>
epochwolf
fuente
pero no seleccionará el elemento apropiado en select: S
totocaster