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?
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) %>
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
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.
Pour cela, j'utilise généralement les gemmes Carmen et Carmen-Rails.
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'))
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 %>
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:
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.
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"%>
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 } %>
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.
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
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.