Rails Выберите Drop Down для состояний?

Мне было интересно, может быть, есть какая-то уже встроенная функция для рельсов, так что она создаст выпадающий список выбора со всеми состояниями штата США, поэтому мне не нужно будет вводить его вручную. Я искал в Интернете, но я не смог найти. Любые предложения о том, что делать, мне не нужно вручную вводить все состояния?

Ответ 1

некоторый вспомогательный файл

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) %>

Ответ 2

Спасибо 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

Ответ 3

Для этого я обычно использую драгоценные камни Carmen и Carmen-Rails.

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'

Затем, чтобы создать тег select для всех состояний США в форме, где вы редактируете поле: state_code объекта: адресной модели...

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

Ответ 4

Это более подробное пошаговое руководство. Я использую Rails 4:

В папке помощников я создал state_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 → я добавляю следующие внутренние 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. Используя это, я дал ошибку метода undefined для select_tag (select_tag находится в направляющих Ruby, как это может быть undefined?) Используя только select, он запустил его.

Ответ 5

Если этот файл не работает:

<%= select_tag :state, us_states%>

Попробуйте следующее:

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

Ответ 6

Я нашел проблему с использованием помощника, чтобы содержать состояния. Он отлично работает при создании новой записи, но если я хочу отредактировать существующую запись, я хочу, чтобы состояние в базе данных было предварительно выбрано в раскрывающемся списке. Я не мог заставить это работать с помощью помощника. Но он работает, если вы создаете таблицу простых состояний. Вот то, что сработало для меня:

Создать таблицу состояний для опций окна выбора

Создайте файл файла модели и базы данных состояния, в котором есть только столбцы для state_code и state_name (или что бы вы ни назвали). rails g model State state_code:string:uniq state_name:string --no-timestamps --no-test-framework. Это создаст файл миграции в папке db/migrate. Если вам не нужен столбец идентификатора, вы можете его отредактировать, вставив , 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 в качестве имени поля, но вы можете сделать это просто состояние или что угодно):

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

Формат метода вспомогательного метода collection_select в блоке формы Rails равен f.collection_select(method, collection, value_method, text_method, options = {}, html_options = {}). Если вы хотите, чтобы state_code являлся как текстом, так и значением раскрывающегося списка, измените: state_name на: state_code в первом аргументе select и в text_method (обратите внимание, что текст и порядки значений отменены). В параметрах я предварительно выбрал "CA", но делаю это только для новой формы, а не для редактирования (или она будет переопределять значение с CA каждый раз). Вы можете изменить это на пустой {include_blank: true} или добавить приглашение {prompt: 'Select State'} или просто по умолчанию использовать выбранное или первое значение с пустым хэшем {}. Если вы хотите сделать нужное поле, вы можете добавить это в параметры html {class: 'form-control', required: true}

Теперь в форме вы можете заполнить ее из таблицы состояний, и она будет выбирать значение при редактировании записи.

Ответ 7

Чтобы заставить это работать с 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 %>

Ответ 8

У вас есть драгоценный камень, который может вам помочь: странный камень, который интегрируется с country_select, поэтому у вас есть полное решение для ввода состояний.

Ответ 9

Отметьте https://rubygems.org/gems/country_state_select

Country State Select - это библиотека, которая предоставляет простой API для создания раскрывающихся списков Country, State/Province и City для использования в формах.

При правильном внедрении выпадающее меню State/Province заполняется соответствующими регионами в зависимости от страны, которую выбрал пользователь.

Например, если пользователь выбирает "Соединенные Штаты Америки" для выпадающего списка Страны, выпадающее меню штата будет заполнено 50 соответствующими штатами плюс округ Колумбия, тогда пользователь может перечислить город в соответствии с выбором штата, но в настоящее время города ограничены.

Ответ 10

Я не знаю, есть ли что-то встроенное Rails для создания поля выбора HTML, заполненного состояниями U.S.A.

Но здесь у вас есть скринкаст, который объясняет это: http://railscasts.com/episodes/88-dynamic-select-menus

Надеюсь, это будет полезно.

Ответ 11

Я создал образец проекта с подробными инструкциями о том, как создавать выпадающие списки в Rails 4.2.2 и Ruby 2.2.2 https://rubyplus.com/articles/2501