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?

totocaster
la source
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] %>
Htanata
la source
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) %>
Lynx
la source
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)
Cheng
la source
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.

Mike Bethany
la source
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 %>
gavit
la source
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

Danengle
la source
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?
totocaster
la source
7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
jschorr
la source
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}
Shelvacu
la source
2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
swapnilp
la source
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.

promacuser
la source
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 
user2480972
la source
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' %>
Shiva Kumar
la source
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
random_user_0891
la source
-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] } %>
epochwolf
la source
mais il ne sélectionnera pas l'élément approprié dans select: S
totocaster