J'essaie de créer un menu déroulant pour permettre à un utilisateur de modifier le champ d'une entrée dans ma table. L'utilisateur dispose de l'une des trois options suivantes: chaud, moyen et froid.
J'ai déjà text_fields
qui fait essentiellement la même chose pour les autres champs, qui sont tous mis à jour lorsque l'utilisateur clique sur un submit_tag
.
Existe-t-il un moyen simple de mettre en place une liste déroulante et d’enregistrer le résultat avec le submit_tag
?
merci,
-Chris
Voici la réponse de base. Le tableau de deux tableaux d'éléments est la partie critique.
<% form_for @entry do |f| %>
<%= f.text_field :name %>
<%= f.select :temperature, [['Hot','hot'],['Medium','medium'],['Cold','cold']] %>
<%= f.submit %>
<% end %>
J'assumerai 2 choses:
<%= form_for @model_instance
(expliqué à la section 2.2 de ce guide ).Supposons que vous ayez deux champs, appelés :name
et :temperature
, contrôlés par deux text_fields
:
<% form_for @article do |f| %>
<%= f.text_field :name %>
<%= f.text_field :temperature %>
<%= f.submit "Create" %> <% end %>
<% end %>
Vous souhaitez maintenant modifier le: contrôle de la température en une liste déroulante acceptant les valeurs chaud, moyen et froid. Ensuite, vous pouvez le faire de cette façon:
<% form_for @article do |f| %>
<%= f.text_field :name %>
<%= f.collection_select :temperature, Article::TEMPERATURES, :to_s, :to_s,
:include_blank => true
%>
<%= f.submit "Create" %> <% end %>
<% end %>
Vous devrez maintenant définir la constante Article::TEMPERATURES
dans votre modèle Article. Cela ne devrait pas être très difficile:
class Article < Activerecord::Base
TEMPERATURES = ['hot', 'medium', 'cold']
Vous vous demandez peut-être pourquoi j'ai ajouté la partie :include_blank
au collection_select
. Cela ajoutera une option "vide" dans votre liste déroulante. Vous aurez besoin de cette option vide lors de la création de nouveaux objets, sauf si vous souhaitez une valeur "par défaut" pour temperature.
Je travaillais sur quelque chose de similaire. Pour que cela fonctionne, ajoutez simplement une énumération ou une constante (similaire à ce que kikito a dit précédemment) dans mon modèle, puis appelez select dans ma fiche.
Voici comment cela peut fonctionner.
en utilisant la constante:
class ClassName <ActiveRecord :: Base TEMPERATURES = ['Chaud', 'Moyen', 'Froid'] Fin
bin/Rails g migration add_column_to_table temperatures: chaîne
_form.html.erb
<%= f.label :temperature %>
<%= f.select :temperature, ClassName::TEMPERATURE %>
ou
en utilisant l'énumération:
class ClassName <ActiveRecord :: Base température minimale: [: chaud,: moyen,: froid] fin
bin/Rails g migration add_column_to_table températures: entier
_form.html.erb
<%= f.label :temperature %>
<%= f.select :temperature, ClassName.temperatures.keys %>
J'espère que ça vous aide!
Vous voudrez peut-être considérer formtastic gem qui contient beaucoup moins de code.
<% semantic_form_for @stuff do |f| %>
<% f.inputs do %>
<%= f.input :name %>
<%= f.input :temperature, :as => :select,
:label => "Degree", :include_blank => false,
:collection => [["Hot", 1], ["Medium", 2], ["Cold", 3]] %>
<% end %>
<%= f.buttons %>
<% end %>
Conformément à toutes les réponses ci-dessus, n'oubliez pas de faire cette dernière étape importante:
Redémarrez votre serveur !
En tant que novice, je me demandais pourquoi mon tableau ne fonctionnait pas alors que je suivais correctement toutes les étapes.