web-dev-qa-db-fra.com

Rails Sélectionnez Drop Down for States?

Je me demandais s’il existait peut-être déjà une fonction intégrée pour Rails qui créerait une liste déroulante de sélection contenant tous les États américains afin que je n’aie pas à la saisir manuellement. J'ai cherché en ligne mais je n'ai pas pu en trouver. Des suggestions sur ce qu'il faut faire pour que je n'ai pas à entrer manuellement tous les états?

69
Jake

un fichier d'aide

def us_states
    [
      ['Alabama', 'AL'],
      ['Alaska', 'AK'],
      ['Arizona', 'AZ'],
      ['Arkansas', 'AR'],
      ['California', 'CA'],
      ['Colorado', 'CO'],
      ['Connecticut', 'CT'],
      ['Delaware', 'DE'],
      ['District of Columbia', 'DC'],
      ['Florida', 'FL'],
      ['Georgia', 'GA'],
      ['Hawaii', 'HI'],
      ['Idaho', 'ID'],
      ['Illinois', 'IL'],
      ['Indiana', 'IN'],
      ['Iowa', 'IA'],
      ['Kansas', 'KS'],
      ['Kentucky', 'KY'],
      ['Louisiana', 'LA'],
      ['Maine', 'ME'],
      ['Maryland', 'MD'],
      ['Massachusetts', 'MA'],
      ['Michigan', 'MI'],
      ['Minnesota', 'MN'],
      ['Mississippi', 'MS'],
      ['Missouri', 'MO'],
      ['Montana', 'MT'],
      ['Nebraska', 'NE'],
      ['Nevada', 'NV'],
      ['New Hampshire', 'NH'],
      ['New Jersey', 'NJ'],
      ['New Mexico', 'NM'],
      ['New York', 'NY'],
      ['North Carolina', 'NC'],
      ['North Dakota', 'ND'],
      ['Ohio', 'OH'],
      ['Oklahoma', 'OK'],
      ['Oregon', 'OR'],
      ['Pennsylvania', 'PA'],
      ['Puerto Rico', 'PR'],
      ['Rhode Island', 'RI'],
      ['South Carolina', 'SC'],
      ['South Dakota', 'SD'],
      ['Tennessee', 'TN'],
      ['Texas', 'TX'],
      ['Utah', 'UT'],
      ['Vermont', 'VT'],
      ['Virginia', 'VA'],
      ['Washington', 'WA'],
      ['West Virginia', 'WV'],
      ['Wisconsin', 'WI'],
      ['Wyoming', 'WY']
    ]
end

sous une forme

<%= select_tag :state, options_for_select(us_states) %>
139
thenengah

Merci Codeglot. Au cas où quelqu'un voudrait afficher l'abréviation d'état à 2 lettres au lieu du nom complet:

def us_states
  [
    ['AK', 'AK'],
    ['AL', 'AL'],
    ['AR', 'AR'],
    ['AZ', 'AZ'],
    ['CA', 'CA'],
    ['CO', 'CO'],
    ['CT', 'CT'],
    ['DC', 'DC'],
    ['DE', 'DE'],
    ['FL', 'FL'],
    ['GA', 'GA'],
    ['HI', 'HI'],
    ['IA', 'IA'],
    ['ID', 'ID'],
    ['IL', 'IL'],
    ['IN', 'IN'],
    ['KS', 'KS'],
    ['KY', 'KY'],
    ['LA', 'LA'],
    ['MA', 'MA'],
    ['MD', 'MD'],
    ['ME', 'ME'],
    ['MI', 'MI'],
    ['MN', 'MN'],
    ['MO', 'MO'],
    ['MS', 'MS'],
    ['MT', 'MT'],
    ['NC', 'NC'],
    ['ND', 'ND'],
    ['NE', 'NE'],
    ['NH', 'NH'],
    ['NJ', 'NJ'],
    ['NM', 'NM'],
    ['NV', 'NV'],
    ['NY', 'NY'],
    ['OH', 'OH'],
    ['OK', 'OK'],
    ['OR', 'OR'],
    ['PA', 'PA'],
    ['RI', 'RI'],
    ['SC', 'SC'],
    ['SD', 'SD'],
    ['TN', 'TN'],
    ['TX', 'TX'],
    ['UT', 'UT'],
    ['VA', 'VA'],
    ['VT', 'VT'],
    ['WA', 'WA'],
    ['WI', 'WI'],
    ['WV', 'WV'],
    ['WY', 'WY']
  ]
end
30
Brian

Ceci est une procédure plus détaillée. J'utilise Rails 4:

Dans le dossier des aides que j'ai créé, states_helper.rb

Dans le fichier states_helper.rb:

module StatesHelper

def us_states
  [
    ['Alabama', 'AL'],
    ['Alaska', 'AK'],
    ['Arizona', 'AZ'],
    ['Arkansas', 'AR'],
    ['California', 'CA'],
    ['Colorado', 'CO'],
    ['Connecticut', 'CT'],
    ['Delaware', 'DE'],
    ['District of Columbia', 'DC'],
    ['Florida', 'FL'],
    ['Georgia', 'GA'],
    ['Hawaii', 'HI'],
    ['Idaho', 'ID'],
    ['Illinois', 'IL'],
    ['Indiana', 'IN'],
    ['Iowa', 'IA'],
    ['Kansas', 'KS'],
    ['Kentucky', 'KY'],
    ['Louisiana', 'LA'],
    ['Maine', 'ME'],
    ['Maryland', 'MD'],
    ['Massachusetts', 'MA'],
    ['Michigan', 'MI'],
    ['Minnesota', 'MN'],
    ['Mississippi', 'MS'],
    ['Missouri', 'MO'],
    ['Montana', 'MT'],
    ['Nebraska', 'NE'],
    ['Nevada', 'NV'],
    ['New Hampshire', 'NH'],
    ['New Jersey', 'NJ'],
    ['New Mexico', 'NM'],
    ['New York', 'NY'],
    ['North Carolina', 'NC'],
    ['North Dakota', 'ND'],
    ['Ohio', 'OH'],
    ['Oklahoma', 'OK'],
    ['Oregon', 'OR'],
    ['Pennsylvania', 'PA'],
    ['Puerto Rico', 'PR'],
    ['Rhode Island', 'RI'],
    ['South Carolina', 'SC'],
    ['South Dakota', 'SD'],
    ['Tennessee', 'TN'],
    ['Texas', 'TX'],
    ['Utah', 'UT'],
    ['Vermont', 'VT'],
    ['Virginia', 'VA'],
    ['Washington', 'WA'],
    ['West Virginia', 'WV'],
    ['Wisconsin', 'WI'],
    ['Wyoming', 'WY']
  ]
end
end

Sous config -> environnements, je mets les éléments suivants dans development.rb et production.rb

config.action_controller.include_all_helpers = true

Enfin, dans ma vue, je mets (ceci est tapé dans Slim HTML)

= form_for :order_submissions, url: order_url, html: { id: "order_form"} do |f|
fieldset
.form-group
  = f.select(:state, options_for_select(us_states, "CA"))

Le "CA" présélectionne Californie dans le menu déroulant au chargement.

NOTE: Je n'ai pas utilisé select_tag. Son utilisation m'a donné une erreur de méthode non définie pour select_tag (select_tag est dans les guides Ruby, comment peut-il être indéfini?) L'utilisation de seulement select l'a fait fonctionner.

18
fuzzybabybunny

Pour cela, j'utilise généralement les gemmes Carmen et Carmen-Rails.

https://github.com/jim/carmen

https://github.com/jim/carmen-Rails

Comme mes projets sont encore tous sur Ruby 1.8, je dois utiliser la branche spécifique de Ruby-18. J'ai donc les éléments suivants dans mon Gemfile:

gem 'carmen', :git => 'git://github.com/jim/carmen.git', :tag => 'Ruby-18'
gem 'carmen-Rails', :git => 'git://github.com/jim/carmen-Rails.git'

Ensuite, pour créer la balise select pour tous les États américains sous une forme dans laquelle vous modifiez le champ: state_code d'un objet de modèle: address ...

subregion_select(:address, :state_code, Carmen::Country.coded('US'))
18
Tinynumbers

Pour que cela fonctionne avec simple_form, je l'ai fait.

Ajouté ceci à mon modèle user.rb:

STATES = 
  [
    ['Alabama', 'AL'],
    ['Alaska', 'AK'],
    ['Arizona', 'AZ'],
    ['Arkansas', 'AR'],
    ['California', 'CA'],
    ['Colorado', 'CO'],
    ['Connecticut', 'CT'],
    ['Delaware', 'DE'],
    ['District of Columbia', 'DC'],
    ['Florida', 'FL'],
    ['Georgia', 'GA'],
    ['Hawaii', 'HI'],
    ['Idaho', 'ID'],
    ['Illinois', 'IL'],
    ['Indiana', 'IN'],
    ['Iowa', 'IA'],
    ['Kansas', 'KS'],
    ['Kentucky', 'KY'],
    ['Louisiana', 'LA'],
    ['Maine', 'ME'],
    ['Maryland', 'MD'],
    ['Massachusetts', 'MA'],
    ['Michigan', 'MI'],
    ['Minnesota', 'MN'],
    ['Mississippi', 'MS'],
    ['Missouri', 'MO'],
    ['Montana', 'MT'],
    ['Nebraska', 'NE'],
    ['Nevada', 'NV'],
    ['New Hampshire', 'NH'],
    ['New Jersey', 'NJ'],
    ['New Mexico', 'NM'],
    ['New York', 'NY'],
    ['North Carolina', 'NC'],
    ['North Dakota', 'ND'],
    ['Ohio', 'OH'],
    ['Oklahoma', 'OK'],
    ['Oregon', 'OR'],
    ['Pennsylvania', 'PA'],
    ['Puerto Rico', 'PR'],
    ['Rhode Island', 'RI'],
    ['South Carolina', 'SC'],
    ['South Dakota', 'SD'],
    ['Tennessee', 'TN'],
    ['Texas', 'TX'],
    ['Utah', 'UT'],
    ['Vermont', 'VT'],
    ['Virginia', 'VA'],
    ['Washington', 'WA'],
    ['West Virginia', 'WV'],
    ['Wisconsin', 'WI'],
    ['Wyoming', 'WY']
  ]

A mon avis, simple_form a utilisé:

<%= simple_form_for(@user) do |f| %>    
    <%= f.input :state, as: :select, collection: User::STATES %>
    <%= f.button :submit %>
<% end %>
6
yellowreign

J'ai trouvé un problème avec l'aide d'un assistant pour contenir les états. Cela fonctionne parfaitement lors de la création d'un nouvel enregistrement, mais si je souhaite modifier un enregistrement existant, je souhaite que l'état de la base de données soit présélectionné dans la liste déroulante. Je ne pouvais pas que ça fonctionne avec l'aide. Mais cela fonctionne si vous créez une table d'états simple. Voici ce qui a fonctionné pour moi:

Créer une table d'états pour les options de la boîte de sélection

Générez un fichier de modèle d'état et une table de base de données contenant uniquement des colonnes pour code_état et nom_état (ou ce que vous souhaitez appeler). Rails g model State state_code:string:uniq state_name:string --no-timestamps --no-test-framework. Cela générera un fichier de migration dans le dossier db/migrate. Si vous ne voulez pas de colonne id, vous pouvez la modifier en insérant , id: false dans la déclaration de bloc create_table. 

# db/migrate/timestamp_create_states.rb
class CreateStates < ActiveRecord::Migration
  def change
    create_table :states, id: false do |t|
      t.string :state_code, null: false
      t.string :state_name
    end
    add_index :states, :state_code, unique: true
  end
end

Et migrez la base de données rake db:migrate.

Vous pouvez renseigner la table à l'aide du fichier prototype. Assurez-vous de supprimer ou de commenter toutes les données précédemment chargées dans le fichier d'origine afin de ne pas ajouter de doublons.

#db/seeds.rb
states = State.create!([
  { state_name: 'Alaska', state_code: 'AK' },
  { state_name: 'Alabama', state_code: 'AL' },
  { state_name: 'Arkansas', state_code: 'AR' },
  { state_name: 'Arizona', state_code: 'AZ' },
  { state_name: 'California', state_code: 'CA' },
  { state_name: 'Colorado', state_code: 'CO' },
  { state_name: 'Connecticut', state_code: 'CT' },
  { state_name: 'District of Columbia', state_code: 'DC' },
  { state_name: 'Delaware', state_code: 'DE' },
  { state_name: 'Florida', state_code: 'FL' },
  { state_name: 'Georgia', state_code: 'GA' },
  { state_name: 'Hawaii', state_code: 'HI' },
  { state_name: 'Iowa', state_code: 'IA' },
  { state_name: 'Idaho', state_code: 'ID' },
  { state_name: 'Illinois', state_code: 'IL' },
  { state_name: 'Indiana', state_code: 'IN' },
  { state_name: 'Kansas', state_code: 'KS' },
  { state_name: 'Kentucky', state_code: 'KY' },
  { state_name: 'Louisiana', state_code: 'LA' },
  { state_name: 'Massachusetts', state_code: 'MA' },
  { state_name: 'Maryland', state_code: 'MD' },
  { state_name: 'Maine', state_code: 'ME' },
  { state_name: 'Michigan', state_code: 'MI' },
  { state_name: 'Minnesota', state_code: 'MN' },
  { state_name: 'Missouri', state_code: 'MO' },
  { state_name: 'Mississippi', state_code: 'MS' },
  { state_name: 'Montana', state_code: 'MT' },
  { state_name: 'North Carolina', state_code: 'NC' },
  { state_name: 'North Dakota', state_code: 'ND' },
  { state_name: 'Nebraska', state_code: 'NE' },
  { state_name: 'New Hampshire', state_code: 'NH' },
  { state_name: 'New Jersey', state_code: 'NJ' },
  { state_name: 'New Mexico', state_code: 'NM' },
  { state_name: 'Nevada', state_code: 'NV' },
  { state_name: 'New York', state_code: 'NY' },
  { state_name: 'Ohio', state_code: 'OH' },
  { state_name: 'Oklahoma', state_code: 'OK' },
  { state_name: 'Oregon', state_code: 'OR' },
  { state_name: 'Pennsylvania', state_code: 'PA' },
  { state_name: 'Puerto Rico', state_code: 'PR' },
  { state_name: 'Rhode Island', state_code: 'RI' },
  { state_name: 'South Carolina', state_code: 'SC' },
  { state_name: 'South Dakota', state_code: 'SD' },
  { state_name: 'Tennessee', state_code: 'TN' },
  { state_name: 'Texas', state_code: 'TX' },
  { state_name: 'Utah', state_code: 'UT' },
  { state_name: 'Virginia', state_code: 'VA' },
  { state_name: 'Vermont', state_code: 'VT' },
  { state_name: 'Washington', state_code: 'WA' },
  { state_name: 'Wisconsin', state_code: 'WI' },
  { state_name: 'West Virginia', state_code: 'WV' },
  { state_name: 'Wyoming', state_code: 'WY' }
])

Ensuite, lancez la tâche rake pour générer la base de données rake db:seed

Dans votre formulaire, vous pouvez ajouter ceci comme zone de sélection (j'utilise state_code comme nom de champ, mais vous pouvez simplement l'indiquer ou ce que vous voulez):

<%= f.label :state_code, 'State', class: 'control-label' %>
<%= f.collection_select(:state_code, State.select(:state_name, :state_code),
   :state_code, :state_name, {selected: 'CA'}, {class: 'form-control'}) %>

Le format de la méthode d'assistance collection_select dans un bloc de formulaire Rails est f.collection_select(method, collection, value_method, text_method, options = {}, html_options = {}). Si vous voulez state_code en tant que texte et valeur de la liste déroulante, remplacez alors: nom_état par: code_état dans le premier argument de sélection et dans la méthode_texte (notez que les ordres texte et valeur sont inversés). Dans les options, j'ai présélectionné 'CA', mais je ne le fais que pour un nouveau formulaire non modifié (ou il remplacera la valeur avec CA à chaque fois). Vous pouvez changer cela en un {include_blank: true} vierge ou ajouter un Prompt {Prompt: 'Select State'} ou simplement le laisser par défaut à la valeur sélectionnée ou à la première valeur avec un hachage vide {}. Si vous voulez que le champ soit obligatoire, vous pouvez l'ajouter aux options html {class: 'form-control', required: true}

Maintenant, dans votre formulaire, vous pouvez le renseigner à partir de la table des états et il présélectionnera la valeur lors de la modification d'un enregistrement. 

5
Steve Carey

Au cas où celui-ci ne fonctionne pas:

<%= select_tag :state, us_states%>

Essaye ça :

 <%=select_tag 'State', options_for_select(us_states),:name=>"state",:id=>"state"%>
3
Sachin Prasad

Vous avez une gemme qui peut vous aider: la gem pays qui s'intègre avec country_select , vous avez donc une solution complète pour l'entrée des états.

De plus, si vous voulez réduire la liste de dépendance des gemmes, vous pouvez simplement faire:

 <%= f.select :country_code, ::ISO3166::Country.all_names_with_codes,{ include_blank: true } %>
2
Paulo Fidalgo

Cochez cette https://rubygems.org/gems/country_state_select

Country State Select est une bibliothèque qui fournit une API simple pour générer des listes déroulantes Pays, État/Province et Ville à utiliser dans les formulaires.

Lorsqu'il est mis en œuvre correctement, un menu déroulant État/Province est rempli avec les régions appropriées en fonction du pays sélectionné par l'utilisateur.

Par exemple, si un utilisateur choisit "États-Unis d'Amérique" pour un menu déroulant Pays, le menu déroulant État sera rempli avec les 50 États appropriés plus le District de Columbia. L'utilisateur peut également répertorier une ville en fonction de la sélection d'un État, mais les villes sont actuellement limitées.

1
Arvind

J'ai créé un exemple de projet avec des instructions détaillées sur la création de listes déroulantes dans Rails 4.2.2 et Ruby 2.2.2 https://rubyplus.com/articles/2501

0
bparanj

Je ne sais pas s’il existe quelque chose dans Rails intégré permettant de créer un champ de sélection HTML rempli d’états américains.

Mais ici, vous avez un screencast qui explique ceci: http://railscasts.com/episodes/88-dynamic-select-menus

J'espère que cela vous sera utile.

0
Israel