我想使用设计为我的注册页面中的国家/地区列表创建一个下拉菜单。我知道我需要创建一个迁移
rails g migration add_countries_to_user country:string
然后我必须在我的视图页面中使用创建表单
<%= f.select :countries, options_for_select(%w[Alfganistan, Albania, Algeria...]) %>
我想知道我的表单是否正确以及我在哪里可以列出国家/地区列表,因为在视图页面中写200多个国家/地区是不对的?
感谢。
答案 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)
答案 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' } %>