86 votes

Comment avoir un champ <select> déroulant dans un formulaire rails ?

Je crée un échafaudage -

rails g scaffold Contact email:string email_provider:string 

mais je veux que le fournisseur d'email soit une liste déroulante (avec gmail/yahoo/msn comme options) et non un champ texte. Comment faire ?

107voto

R Milushev Points 2610

Vous pouvez consulter la documentation Rails . Quoi qu'il en soit, dans votre formulaire :

  <%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>

Comme vous pouvez le deviner, vous devez prédéfinir les fournisseurs d'email dans un autre modèle - Provider Il est donc important de savoir où les sélectionner.

63voto

Fdwillis Points 970

Ou pour des options personnalisées

<%= f.select :desired_attribute, ['option1', 'option2']%>

17voto

Michael Durrant Points 30342

Vous créez la collection dans la base de données Contact contrôleur -

app/controllers/contacts_controller.erb 

Ajout

@providers = Provider.all.by_name

aux méthodes de création et d'édition, en utilisant une portée pour l'élément by_name dans le Provider modèle - app/models/provider.rb - pour le classement par nom

scope by_name  order(:name)

Ensuite, dans la vue - app/views/contacts/_form.html.erb - vous utilisez

<%= f.collection_select :provider_id, @providers, :id, :name, include_blank: true %>

Pour les formulaires rails, je vous recommande aussi fortement de regarder un constructeur de formulaire comme simple_form - https://github.com/plataformatec/simple_form - qui se chargera de toutes les tâches lourdes.

11voto

phobos Points 332

Il s'agit d'un long chemin, mais si vous ne l'avez pas encore mis en œuvre, vous pouvez créer vos modèles de cette manière. La méthode ci-dessous décrit la modification d'une base de données existante.

1) Créer un nouveau modèle pour les fournisseurs de courrier électronique :
$ rails g model provider name

2) Cela créera votre modèle avec une chaîne de noms et des horodatages. Il crée également la migration que nous devons ajouter au schéma :
$ rake db:migrate

3) Ajouter une migration pour ajouter l'identifiant des fournisseurs dans le contact :
$ rails g migration AddProviderRefToContacts provider:references

4) Examiner le fichier de migration pour vérifier qu'il est correct, et le migrer également :
$ rake db:migrate

5) Ok, maintenant que nous avons un provider_id, nous n'avons plus besoin de la chaîne email_provider d'origine :
$ rails g migration RemoveEmailProviderFromContacts

6) Dans le fichier de migration, ajoutez le changement qui ressemblera à quelque chose comme :

class RemoveEmailProviderFromContacts < ActiveRecord::Migration
  def change
    remove_column :contacts, :email_provider
  end
end

7) Une fois que cela est fait, migrer le changement :
$ rake db:migrate

8) Profitons-en pour mettre à jour nos modèles :
Contact : belongs_to :provider
Prestataire : has_many :contacts

9) Ensuite, nous mettons en place la logique du menu déroulant dans la partie _form.html.erb des vues :

  <div class="field">
    <%= f.label :provider %><br>
    <%= f.collection_select :provider_id, Provider.all, :id, :name %>
  </div>

10) Enfin, nous devons ajouter les proviseurs eux-mêmes. Une façon de le faire serait d'utiliser le fichier de semences :

Provider.destroy_all

gmail = Provider.create!(name: "gmail")
yahoo = Provider.create!(name: "yahoo")
msn = Provider.create!(name: "msn")

$ rake db:seed

7voto

gsumk Points 46

<%= f.select :email_provider, ["gmail","yahoo","msn"]%>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X