Aide à la sélection des rails - Valeur sélectionnée par défaut, comment?


182

Voici un morceau de code que j'utilise maintenant:

<%= f.select :project_id, @project_select %>

Comment le modifier pour que sa valeur par défaut soit égale à params[:pid]lorsque la page est chargée?


Je ne sais pas si vous voulez qu'un projet par défaut soit sélectionné lorsque la page est chargée, si: project_id n'est pas défini, ou si vous souhaitez renvoyer la valeur de la sélection dans le hachage des paramètres comme: pid.
Tilendor

Réponses:


223

Cela devrait le faire:

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

5
sans paramètres, options_for_selectc'est mieux. C'est bon pour n'importe quelle situation, bon pour l'édition de formulaire aussi.
Adriano Resende

Voici la CLÉ: REGARDEZ votre fonction (options_for_select () vs f.select. Rappelez-vous que ce sont des fonctions différentes.
FlyingV

126

Utilisez le bon attribut de l'instance actuelle (par exemple @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

4
C'est la meilleure réponse car cela fonctionne select_tagaussi. Merci, cela m'a vraiment aidé aussi.
stephenmurdoch

7
Vous pouvez aussi essayeroptions_for_select(..., f.object.project_id )
août

Merci beaucoup! Toutes les autres réponses acceptées ne disent pas comment sélectionner via variable.
Mike Belanger

52

Rails 3.0.9

select options_for_select([value1, value2, value3], default)

Je ne pouvais pas comprendre cette solution jusqu'à ce que je remarque votre parenthèse fermante autour du tableau de valeurs AVANT la virgule qui sépare votre valeur par défaut ... J'ai manqué cette parenthèse icivalue3], default
BigRon

33

Le problème avec toutes ces réponses est qu'elles définissent le champ sur la valeur par défaut même si vous essayez de modifier votre enregistrement.

Vous devez définir la valeur par défaut sur votre valeur existante, puis la définir uniquement sur la valeur par défaut réelle si vous n'avez pas de valeur. Ainsi:

f.select :field, options_for_select(value_array, f.object.field || default_value)

Pour ceux qui ne sont pas familiers avec f.object.fieldvous, utilisez toujours f.objectpuis ajoutez votre nom de champ à la fin de celui-ci.


3
C'est une solution propre, et comme mentionné, vous souhaitez définir la valeur par défaut uniquement sur nouveau et la valeur actuelle lors de la modification.
compter0

1
Je sais que c'est un vieux fil, mais pour quiconque pourrait le rencontrer, cette réponse fonctionne également avec le select2plugin JS. Fonctionne parfaitement si vous créez ou modifiez des enregistrements avec le même formulaire et utilisez select2, en particulier avec du texte d'espace réservé.
cdouble.bhuck

Je pense que cela devrait être celui accepté comme réponse, comme @Mike Bethany a dit toutes les autres réponses car le formulaire n'est rendu que pour les nouveaux enregistrements lorsque l'approche des rails consiste à réutiliser le formulaire. Kudos Mike
Erick Castrillo

22

Essaye ça:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>

En utilisant Rails 4, le params[:pid]n'a pas fonctionné, mais votre exemple a fonctionné.
Eric Wanchic

Cela a fonctionné pour moi car j'utilise un intérieur partiel "f.fields_for" Merci.
Hugo du

11

si params [: pid] est une chaîne, qui si elle provient d'un formulaire, c'est le cas, vous devrez probablement utiliser

params[:pid].to_i  

pour l'élément correct à sélectionner dans la liste de sélection


Cette réponse m'a aidé à identifier mon problème. Ma boîte de sélection est dynamique et extrait une collection de la base de données. J'essayais de remplir la sélection par défaut par un titre, pas par un identifiant de l'élément. Cette réponse m'a aidé à voir ce problème, et une fois que j'ai rempli ma @projectvariable avec un identifiant de la table de base de données, au lieu d'un titre, ce code a fonctionné ajouté au dos de l' form.selectaide: selected: @projectMerci @danengle
Christopher Warrington

10

J'ai trouvé une solution et j'ai trouvé que je suis assez inexpérimenté en RoR.

À l'intérieur du contrôleur qui gère la vue décrite ci-dessus, ajoutez ceci:

@work.project_id = params[:pid] unless params[:pid].nil?

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

3

Je n'ai pas pu faire fonctionner cela et j'ai trouvé que je devais ajouter l'attribut html "sélectionné" non seulement à la <option>balise correcte mais aussi à la <select>balise. Les documents de MDN sur l'attribut sélectionné de la balise de sélection disent:

selected - L'attribut booléen indique qu'une option spécifique peut être initialement sélectionnée.

Cela signifie que le code devrait ressembler à:

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

Vous pouvez également définir l'attribut: project_id dans le contrôleur, car le premier argument de f.select extrait cet attribut particulier.


0

Si vous essayez d'imprimer l'objet f, vous verrez qu'il y a f.object qui peut être sondé pour obtenir l'élément sélectionné (applicable pour tous les rails version> 2.3)

logger.warn("f #{f.object.inspect}")

donc, utilisez le script suivant pour obtenir la bonne option sélectionnée:

:selected => f.object.your_field 

0

C'est déjà expliqué, va essayer de donner un exemple

que la liste de sélection soit

select_list = { eligible: 1, ineligible: 0 }

Ainsi, le code suivant entraîne

<%= f.select :to_vote, select_list %>

<select name="to_vote" id="to_vote">
  <option value="1">eligible</option>
  <option value="0">ineligible</option>
</select>

Donc, pour faire une option sélectionnée par défaut, nous devons utiliser selected: value .

<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>

si can_vote? renvoie vrai, il définit sélectionné: 1 puis la première valeur sera sélectionnée, sinon la seconde.

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 les options de sélection ne sont qu'une liste de tableaux au lieu de hast, la sélection sera juste la valeur à sélectionner, par exemple si

select_list = [ 'eligible', 'ineligible' ]

maintenant le sélectionné prendra juste

<%= f.select :to_vote, select_list, selected: 'ineligible' %>

0

La réponse de Mike Bethany ci-dessus a fonctionné pour définir une valeur par défaut lorsqu'un nouvel enregistrement était en cours de création et conserver la valeur que l'utilisateur a sélectionnée dans le formulaire d'édition. Cependant, j'ai ajouté une validation de modèle et cela ne m'a pas permis de soumettre le formulaire. Voici ce qui a fonctionné pour moi d'avoir une validation de modèle sur le terrain et d'afficher une valeur par défaut ainsi que la valeur sélectionnée par l'utilisateur en mode édition.

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

Validation du modèle

  validates :project_id, presence: true

-2

Cela devrait fonctionner pour vous. Il passe simplement {:value => params[:pid] }à la variable html_options.

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>

mais il ne sélectionnera pas l'élément approprié dans select: S
totocaster
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.