使用设计创建下拉菜单注册页面

时间:2015-05-09 05:31:54

标签: ruby-on-rails devise

我想使用设计为我的注册页面中的国家/地区列表创建一个下拉菜单。我知道我需要创建一个迁移

rails g migration add_countries_to_user country:string

然后我必须在我的视图页面中使用创建表单

<%= f.select :countries, options_for_select(%w[Alfganistan, Albania, Algeria...]) %>

我想知道我的表单是否正确以及我在哪里可以列出国家/地区列表,因为在视图页面中写200多个国家/地区是不对的?

感谢。

5 个答案:

答案 0 :(得分:1)

根据建议,您可以使用country_select。或者,你可以自己做:

创建一个初始化程序,其中包含国家/地区列表(或您特别需要的任何内容)config/initializers/countries.yml

countries:
  - Afghanistan
  - United States
  - ...

通过创建rake任务将其加载到数据库中: lib/tasks/load_countries.rb

namespace :db do
  desc "Loads countries in database"
  task :load_countries => :environment do |t|
    countries_list = YAML.load("#{Rails.root}/config/initializers/countries.yml")['countries']
    countries.each do |country|
      Country.find_or_create_by_name(country)
    end
  end
end

每当您在yml中添加任何国家/地区时,都可以通过调用此rake任务填充它:rake db:load_countries

维护模型Country

class Country < ActiveRecord::Base
  validates :name, presence: true, uniqueness: { case_insensitive: true }
end

我正在考虑上面的用户belongs_to 1个国家/地区以及国家has_many个用户。在您看来,:

f.select :country, options_from_collection_for_select(Country.all, :id, :name)

注意:我正在使用上面的关联方法,因为将来可以更轻松地对此字段进行查询,而不像在用户中保存实际字符串。

答案 1 :(得分:0)

使用country_select gem。

# Gemfile
gem 'country_select'

形式:

country_select("user", "country")

答案 2 :(得分:0)

除了宝石和国家从YML读取。

另一个选择是在帮助程序中创建方法

文件:app / helpers / country_helper.rb

def get_countries
  {:1=>Africa,:2=>"America"}
end

在视图中,您可以使用这种方式

<%= options_from_collection_for_select(get_countries, :id, :name) %>

答案 3 :(得分:0)

查看rails#88修订的动态选择菜单。您需要的是方法调用grouped_collection_select,您可以根据它们彼此之间的对应关系来绘制所需的项目

答案 4 :(得分:0)

您可以将此作为辅助方法。例如,在users_helper.rb中,您可以列出选择:

def country_options
    [
        ['Afghanistan'],
        ['Albania'],
            ...
        ['Zimbabwe']
    ]
end

然后,您的选择器从该辅助方法中拉出:

<%= f.select :country, options_for_select(country_options), { prompt: 'Choose Country' } %>