eine Hilfsdatei
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
in irgendeiner Form
<%= select_tag :state, options_for_select(us_states) %>
<%= select_tag :state, options_for_select(us_states) %>
= f.select :state, options_for_select(us_states),{}, class: 'form-control'
Danke Codeglot. Falls jemand die 2-Buchstaben-Statusabkürzung anstelle des vollständigen Namens anzeigen möchte:
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
quelle
Dies ist eine detailliertere exemplarische Vorgehensweise. Ich benutze Rails 4:
Unter dem Helferordner habe ich state_helper.rb erstellt
Innerhalb von 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
Unter config -> Umgebungen habe ich Folgendes in development.rb und Production.rb eingefügt
config.action_controller.include_all_helpers = true
Schließlich habe ich in meiner Ansicht (dies ist in Slim HTML getippt)
= 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"))
Die "CA" wählt Kalifornien im Dropdown-Menü beim Laden vor.
HINWEIS: Ich habe NICHT verwendet
select_tag
. Die Verwendung gab mir einen undefinierten Methodenfehler fürselect_tag
(select_tag ist in den Ruby-Handbüchern, wie kann es undefiniert sein?) Die Verwendung hat geradeselect
funktioniert.quelle
Dafür verwende ich normalerweise die Edelsteine Carmen und Carmen-Rails.
https://github.com/jim/carmen
https://github.com/jim/carmen-rails
Da meine Projekte immer noch alle auf Ruby 1.8 basieren, muss ich den spezifischen Ruby-18-Zweig verwenden, sodass ich in meiner Gemfile Folgendes habe:
gem 'carmen', :git => 'git://github.com/jim/carmen.git', :tag => 'ruby-18' gem 'carmen-rails', :git => 'git://github.com/jim/carmen-rails.git'
Um dann das Auswahl-Tag für alle US-Bundesstaaten in einem Formular zu erstellen, in dem Sie das Feld: state_code eines: Adressmodellobjekts bearbeiten ...
subregion_select(:address, :state_code, Carmen::Country.coded('US'))
quelle
Ich habe ein Problem mit der Verwendung eines Helfers gefunden, um die Zustände zu enthalten. Es funktioniert perfekt beim Erstellen eines neuen Datensatzes. Wenn ich jedoch einen vorhandenen Datensatz bearbeiten möchte, soll der Status in der Datenbank im Dropdown-Feld vorausgewählt werden. Ich konnte das mit dem Helfer nicht zum Laufen bringen. Es funktioniert jedoch, wenn Sie eine einfache Statustabelle erstellen. Folgendes hat bei mir funktioniert:
Erstellen Sie eine Statustabelle für die Auswahlfeldoptionen
Generieren Sie eine Statusmodelldatei und eine Datenbanktabelle, die nur Spalten für Statuscode und Statusname enthalten (oder wie auch immer Sie sie aufrufen möchten).
rails g model State state_code:string:uniq state_name:string --no-timestamps --no-test-framework
. Dadurch wird eine Migrationsdatei im Ordner db / migrate generiert. Wenn Sie keine ID-Spalte möchten, können Sie diese bearbeiten, indem Sie sie, id: false
in die Blockdeklaration create_table einfügen .# 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
Und migrieren Sie die Datenbank
rake db:migrate
.Sie können die Tabelle mit der Seed-Datei füllen. Stellen Sie sicher, dass Sie alle zuvor geladenen Daten in der Seed-Datei löschen oder auskommentieren, damit Sie keine Duplikate hinzufügen.
#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' } ])
Führen Sie dann die Rechenaufgabe aus, um die Datenbank zu säen
rake db:seed
In Ihrem Formular können Sie dies als Auswahlfeld hinzufügen (ich verwende state_code als Feldnamen, aber Sie können festlegen, dass es nur state oder was auch immer Sie möchten):
<%= 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'}) %>
Das Hilfsmethodenformat collection_select in einem Rails-Formularblock lautet
f.collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
. Wenn Sie state_code sowohl als Text als auch als Wert des Dropdown-Felds verwenden möchten, ändern Sie im ersten Auswahlargument und in der text_method den Wert: state_name in: state_code (beachten Sie, dass die Reihenfolge von Text und Wert umgekehrt ist). In den Optionen habe ich 'CA' vorausgewählt, aber nur für ein neues Formular, das nicht bearbeitet wurde (oder es überschreibt den Wert jedes Mal mit CA). Sie können dies in ein Leerzeichen ändern{include_blank: true}
oder eine Eingabeaufforderung hinzufügen{prompt: 'Select State'}
oder den ausgewählten oder ersten Wert mit einem leeren Hash als Standard festlegen{}
. Wenn Sie das Feld erforderlich machen möchten, können Sie dies zu den HTML-Optionen hinzufügen{class: 'form-control', required: true}
Jetzt können Sie es in Ihrem Formular aus der Statustabelle ausfüllen und es wählt den Wert beim Bearbeiten eines Datensatzes vor.
quelle
<%= f.select :state, options_for_select(us_states, @temp_state), id: :profile_state %>
Nun, um herauszufinden, wie der vollständige Name des Status angezeigt wird.<% if profile.state.nil? @temp_state = 'Arizona' else @temp_state = profile.state end %>
Einzug und neue Zeilen werden in diesen Kommentaren leider nicht angezeigt.Damit das funktioniert
simple_form
, habe ich das gemacht.Fügte dies meinem
user.rb
Modell hinzu: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'] ]
Die simple_form hat meiner Ansicht nach Folgendes verwendet:
<%= simple_form_for(@user) do |f| %> <%= f.input :state, as: :select, collection: User::STATES %> <%= f.button :submit %> <% end %>
quelle
Falls dies nicht funktioniert:
<%= select_tag :state, us_states%>
Versuche dies :
<%=select_tag 'State', options_for_select(us_states),:name=>"state",:id=>"state"%>
quelle
Sie haben ein Juwel, das Ihnen helfen kann: das Länderjuwel , das in country_select integriert ist , sodass Sie eine vollständige Lösung für die Eingabe von Staaten haben.
Auch wenn Sie die Edelsteinabhängigkeitsliste reduzieren möchten, können Sie einfach Folgendes tun:
<%= f.select :country_code, ::ISO3166::Country.all_names_with_codes,{ include_blank: true } %>
quelle
Überprüfen Sie diese https://rubygems.org/gems/country_state_select
Country State Select ist eine Bibliothek, die eine einfache API zum Generieren von Dropdowns für Land, Bundesland / Provinz und Stadt zur Verwendung in Formularen bietet.
Bei korrekter Implementierung wird eine Dropdown-Liste für Bundesstaat / Provinz mit geeigneten Regionen gefüllt, je nachdem, welches Land ein Benutzer ausgewählt hat.
Wenn ein Benutzer beispielsweise "Vereinigte Staaten von Amerika" für ein Dropdown-Menü "Land" auswählt, wird das Dropdown-Menü "Bundesstaat" mit den 50 entsprechenden Bundesstaaten sowie dem District of Columbia gefüllt. Dann kann der Benutzer die Stadt gemäß der Auswahl des Bundesstaates auflisten, aber derzeit sind die Städte begrenzt.
quelle
Ich weiß nicht, ob es etwas eingebautes Rails gibt, um ein HTML-Auswahlfeld mit US-Bundesstaaten zu erstellen.
Aber hier haben Sie einen Screencast, der dies erklärt: http://railscasts.com/episodes/88-dynamic-select-menus
Ich hoffe es wird nützlich sein.
quelle
Ich habe ein Beispielprojekt mit detaillierten Anweisungen zum Erstellen von Dropdowns in Rails 4.2.2 und Ruby 2.2.2 https://rubyplus.com/articles/2501 erstellt
quelle
Wenn Sie den Status unter vollem Namen speichern möchten
# frozen_string_literal: true module StateHelper def us_states [ ['Alabama'], ['Alaska'], ['Arizona'], ['Arkansas'], ['California'], ['Colorado'], ['Connecticut'], ['Delaware'], ['District of Columbia'], ['Florida'], ['Georgia'], ['Hawaii'], ['Idaho'], ['Illinois'], ['Indiana'], ['Iowa'], ['Kansas'], ['Kentucky'], ['Louisiana'], ['Maine'], ['Maryland'], ['Massachusetts'], ['Michigan'], ['Minnesota'], ['Mississippi'], ['Missouri'], ['Montana'], ['Nebraska'], ['Nevada'], ['New Hampshire'], ['New Jersey'], ['New Mexico'], ['New York'], ['North Carolina'], ['North Dakota'], ['Ohio'], ['Oklahoma'], ['Oregon'], ['Pennsylvania'], ['Puerto Rico'], ['Rhode Island'], ['South Carolina'], ['South Dakota'], ['Tennessee'], ['Texas'], ['Utah'], ['Vermont'], ['Virginia'], ['Washington'], ['West Virginia'], ['Wisconsin'], ['Wyoming'] ] end end
Und dann in Form
<%= f.select :state, options_for_select(us_states), class:"form-control", required: true %>
quelle
Verwenden Sie einen Hash. Ich habe meine in config / initializers / us_states.rb abgelegt , aber es funktioniert in einem Helfer oder fast überall dort, wo Sie es bevorzugen:
US_STATES = { 'AL': 'Alabama', 'AK': 'Alaska', 'AZ': 'Arizona', 'AR': 'Arkansas', 'CA': 'California', 'CO': 'Colorado', 'CT': 'Connecticut', 'DE': 'Delaware', 'DC': 'District of Columbia', 'FL': 'Florida', 'GA': 'Georgia', 'HI': 'Hawaii', 'ID': 'Idaho', 'IL': 'Illinois', 'IN': 'Indiana', 'IA': 'Iowa', 'KS': 'Kansas', 'KY': 'Kentucky', 'LA': 'Louisiana', 'ME': 'Maine', 'MD': 'Maryland', 'MA': 'Massachusetts', 'MI': 'Michigan', 'MN': 'Minnesota', 'MS': 'Mississippi', 'MO': 'Missouri', 'MT': 'Montana', 'NE': 'Nebraska', 'NV': 'Nevada', 'NH': 'New Hampshire', 'NJ': 'New Jersey', 'NM': 'New Mexico', 'NY': 'New York', 'NC': 'North Carolina', 'ND': 'North Dakota', 'OH': 'Ohio', 'OK': 'Oklahoma', 'OR': 'Oregon', 'PA': 'Pennsylvania', 'PR': 'Puerto Rico', 'RI': 'Rhode Island', 'SC': 'South Carolina', 'SD': 'South Dakota', 'TN': 'Tennessee', 'TX': 'Texas', 'UT': 'Utah', 'VT': 'Vermont', 'VA': 'Virginia', 'WA': 'Washington', 'WV': 'West Virginia', 'WI': 'Wisconsin', 'WY': 'Wyoming' }
Dann in meiner Form:
<%= form.select :state, US_STATES.invert.sort %>
Da der aus zwei Buchstaben bestehende Code gespeichert ist, verweise ich, wenn ich den Namen des Status anzeigen möchte, nur auf den aus zwei Buchstaben bestehenden Schlüssel im Hash:
Wenn Sie wirklich schick werden möchten, initialisieren Sie sie in einer Gebietsschemadatei (z. B. config / locales / en.yml ):
--- en: us_states: AL: Alabama AK: Alaska AZ: Arizona # etc.
Und greifen Sie in Ihren Ansichten darauf zu mit:
<%= t "us_states.#{state}" %>
ℹ️ Dies funktioniert tatsächlich besser mit Länder- und Sprachcodes, wenn Sie mehrere Sprachen in Ihrer App unterstützen.
quelle