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?


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] %>

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) %>

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)

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.


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 %>

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


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?

7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>

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}

2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>

0

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


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 

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' %>

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

-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] } %>

pero no seleccionará el elemento apropiado en select: S
totocaster
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.