web-dev-qa-db-fra.com

Ruby on Rails: menu déroulant

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

19
user237300

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 %>
38
Mark Swardstrom

J'assumerai 2 choses:

  • Que vous êtes l'idiome <%= form_for @model_instance (expliqué à la section 2.2 de ce guide ).
  • Vous souhaitez que les valeurs "chaude", "moyenne" et "froide" soient stockées sous forme de chaînes (et non sous les nombres 1, 2 et 3 ou similaires) dans votre base de données.

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.

23
kikito
3
Ben

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!

2
mewallacee

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 %>  
1
Chandra Patni

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.

0
ekushay