web-dev-qa-db-ja.com

Rails状態のドロップダウンを選択しますか?

Railsの組み込み関数がいくつかあるので、すべての米国の州で選択ドロップダウンリストが作成されるので、手動で入力する必要はありません。オンラインで検索しましたが、何も見つかりませんでした。そのための提案は、手動ですべての州を入力する必要はありませんか?

71
Jake

いくつかのヘルパーファイル

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

何らかの形で

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

Codeglotに感謝します。誰かがフルネームの代わりに2文字の州の略語を表示したい場合:

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

これは、より詳細なウォークスルーです。 Rails 4:

ヘルパーフォルダーの下にstates_helper.rbを作成しました

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

Config-> environmentの下で、development.rbおよびproduction.rb内に以下を配置します

config.action_controller.include_all_helpers = true

最後に、ビュー内に配置します(これは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"))

「CA」は、ロード時のドロップダウンメニューでカリフォルニアを事前選択します。

注:select_tagは使用しませんでした。それを使用すると、select_tagの未定義メソッドエラーが発生しました(select_tagはRubyガイドにありますが、どのように未定義にできますか?)selectだけを使用すると動作します。

18
fuzzybabybunny

このために、私は通常、カルメンとカルメン・レールの宝石を使用します。

https://github.com/jim/carmen

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

私のプロジェクトはまだRuby 1.8にあるので、特定のRuby-18ブランチを使用する必要があるため、Gemfileに次のものがあります。

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

次に、:addressモデルオブジェクトの:state_codeフィールドを編集しているフォームで、すべての米国の州の選択タグを作成します...

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

これをsimple_formで動作させるために、私はこれを行いました。

これを私の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']
  ]

私のビューのsimple_formにそれを使用させました:

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

ヘルパーを使用して状態を封じ込めることで問題が見つかりました。新しいレコードを作成するときに完全に機能しますが、既存のレコードを編集する場合は、データベースの状態をド​​ロップダウンボックスで事前に選択する必要があります。ヘルパーを使用してそれを動作させることができませんでした。ただし、単純な状態テーブルを作成すれば機能します。ここに私のために働いたものがあります:

選択ボックスオプションの状態テーブルを作成する

State_codeおよびstate_name(またはそれらを呼び出すもの)の列のみを持つ状態モデルファイルとデータベーステーブルを生成します。 _Rails g model State state_code:string:uniq state_name:string --no-timestamps --no-test-framework_。これにより、db/migrateフォルダーに移行ファイルが生成されます。 id列が必要ない場合は、_, id: false_を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
_

そして、データベース_rake db:migrate_を移行します。

シードファイルを使用してテーブルを作成できます。重複を追加しないように、シードファイル内の以前にロードされたデータを削除またはコメント化してください。

_#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' }
])
_

次に、rakeタスクを実行してdb _rake db:seed_をシードします

フォームでこれを選択ボックスとして追加することができます(フィールド名としてstate_codeを使用していますが、それをstateまたは必要なものにすることができます):

_<%= 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'}) %>
_

Railsフォームブロックのcollection_selectヘルパーメソッドの形式はf.collection_select(method, collection, value_method, text_method, options = {}, html_options = {})です。ドロップダウンボックスのテキストと値の両方としてstate_codeが必要な場合は、:state_nameを:state_codeに変更します。最初の選択引数とtext_methodで(テキストと値の順序が逆になっていることに注意してください。)オプションで「CA」を事前選択しましたが、編集せずに新しいフォームに対してのみ行います(または毎回CAで値をオーバーライドします) )。これを空の_{include_blank: true}_に変更するか、プロンプト_{Prompt: 'Select State'}_を追加するか、空のハッシュ_{}_で選択した値または最初の値にデフォルトを設定することができます。必要なフィールドは、それをhtmlオプションに追加できます_{class: 'form-control', required: true}_

これで、フォームでステートテーブルからデータを入力でき、レコードの編集時に値が事前に選択されます。

5
Steve Carey

あなたはあなたを助けることができる宝石を持っています: 国gemcountry_select 、状態入力の完全なソリューションがあります。

また、gemの依存関係リストを減らしたい場合は、次のようにします。

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

これが機能しない場合:

<%= select_tag :state, us_states%>

これを試して :

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

これを確認してください https://rubygems.org/gems/country_state_select

Country State Selectは、フォームで使用するCountry、State/ProvinceおよびCityドロップダウンを生成する簡単なAPIを提供するライブラリです。

正しく実装されると、州/県のドロップダウンには、ユーザーが選択した国に基づいて適切な地域が表示されます。

たとえば、ユーザーが[国]ドロップダウンに[アメリカ合衆国]を選択した場合、[州]ドロップダウンには50の適切な州とコロンビア特別区が入力されます。

1
Arvind

Rails 4.2.2 and Ruby 2.2.2 https: //rubyplus.com/articles/2501

0
bparanj

組み込みの何かがあるかどうかはわかりませんRails HTMLの選択フィールドに米国の州が入力されるようにします。

しかし、これを説明するスクリーンキャストがあります: http://railscasts.com/episodes/88-dynamic-select-menus

役に立つことを願っています。

0
Israel