Ruby on rails Rails选择状态下拉列表?
我想知道rails是否已经内置了一些功能,这样它就可以创建一个包含所有美国州的选择下拉列表,这样我就不必手动输入了。我在网上搜索过,但没有找到。有什么建议吗?我不必手动输入所有状态?一些帮助文件Ruby on rails Rails选择状态下拉列表?,ruby-on-rails,ruby,drop-down-menu,Ruby On Rails,Ruby,Drop Down Menu,我想知道rails是否已经内置了一些功能,这样它就可以创建一个包含所有美国州的选择下拉列表,这样我就不必手动输入了。我在网上搜索过,但没有找到。有什么建议吗?我不必手动输入所有状态?一些帮助文件 def us_states [ ['Alabama', 'AL'], ['Alaska', 'AK'], ['Arizona', 'AZ'], ['Arkansas', 'AR'], ['California', 'CA'],
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) %>
我不知道是否有内置的Rails可以让HTML选择字段填充美国各州 但这里有一个屏幕,解释了这一点:
我希望它会有用。谢谢Codeglot。如果任何人想要显示两个字母的州缩写而不是全名:
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
为此,我通常使用Carmen和Carmen Rails宝石 由于我的项目仍然都在Ruby 1.8上,我必须使用特定的Ruby-18分支,因此我的文件中有以下内容:
gem 'carmen', :git => 'git://github.com/jim/carmen.git', :tag => 'ruby-18'
gem 'carmen-rails', :git => 'git://github.com/jim/carmen-rails.git'
然后,要在编辑:地址模型对象的:state_code字段的表单中为所有美国州创建select标记
subregion_select(:address, :state_code, Carmen::Country.coded('US'))
如果这个不起作用:
<%= select_tag :state, us_states%>
试试这个:
<%=select_tag 'State', options_for_select(us_states),:name=>"state",:id=>"state"%>
“状态”,:id=>“状态”%>
您有一个gem可以帮助您:它与集成,因此您有一个完整的状态输入解决方案
此外,如果您想减少gem依赖项列表,您可以执行以下操作:
<%= f.select :country_code, ::ISO3166::Country.all_names_with_codes,{ include_blank: true } %>
这是一个更详细的演练。我使用的是Rails 4: 在helpers文件夹下,我创建了states_helper.rb 内部状态\u 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->environments下,我将以下内容放在development.rb和production.rb中
config.action_controller.include_all_helpers = true
最后,在我的视图中输入(这是用slimhtml输入的)
“CA”在加载时在下拉菜单中预先选择California
注意:我没有使用
选择标签
。使用它给了我一个未定义的select_-tag
方法错误(select_-tag在Ruby指南中,怎么可以未定义?)我创建了一个示例项目,详细说明了如何在Rails 4.2.2和Ruby 2.2.2中创建下拉列表。我发现使用助手来包含状态存在问题。它在创建新记录时非常有效,但如果我想编辑现有记录,我希望在下拉框中预选数据库中的状态。我无法使用助手使其工作。但是,如果您创建一个简单的states表,它确实可以工作。以下是对我有效的方法:
为“选择框”选项创建状态表
生成一个状态模型文件和数据库表,其中只包含State_code和State_name列(或任何您想调用它们的列)。
railsg模型状态\u代码:string:uniq状态\u名称:string--无时间戳--无测试框架
。这将在db/migrate文件夹中生成一个迁移文件。如果不需要id列,可以通过在create_table块声明中插入,id:false
来编辑它
# 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任务以对dbrake db:seed进行种子设定
在您的表单中,您可以将其添加为选择框(我使用state_code作为字段名,但您可以将其设置为state或任何您想要的名称):
Rails表单块中的collection\u select helper方法格式是f.collection\u select(method,collection,value\u method,text\u method,options={},html\u options={})
。如果希望将state_code作为下拉框的文本和值,则在第一个select参数和text_方法中将:state_名称更改为:state_code(注意,文本和值顺序颠倒)。在选项中,我预先选择了“CA”,但只对新表单执行此操作,而不进行编辑(否则每次都会用CA覆盖该值)。您可以将其更改为空白{include_blank:true}
或添加提示{prompt:'Select State'}
,或将其默认为所选值或第一个值,并使用空哈希{}
。如果您想使该字段成为必填字段,可以将其添加到html选项{class:'form control',required:true}
现在,在您的表单中,您可以从states表中填充它,它将在编辑记录时预选值 检查这个
Country State Select是一个库,提供了一个简单的API来生成国家、州/省和城市下拉列表,以便在表单中使用
正确实施后,州/省下拉列表将根据用户选择的国家填充相应的地区
例如,如果用户选择“美利坚合众国”作为国家下拉列表,则州下拉列表将填充50个适当的州加上哥伦比亚特区,然后用户可以根据州选择列出城市,但目前城市有限。为了使这一点与简单表单
一起使用,我这样做了
将此添加到我的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_for(@user) do |f| %>
<%= f.input :state, as: :select, collection: User::STATES %>
<%= f.button :submit %>
<% end %>
如果要以全名保存状态
# 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
然后在形式上
<%= f.select :state, options_for_select(us_states), class:"form-control", required: true %>
使用散列。我把我的文件放在了config/initializers/us_states.rb中,但它可以在助手中工作,也可以在您喜欢的任何地方工作:
US_州={
“AL”:“阿拉巴马州”,
‘AK’:‘阿拉斯加’,
“AZ”:“亚利桑那州”,
“AR”:“阿肯色州”,
‘CA’:‘加利福尼亚’,
‘CO’:‘Colorado’,
“CT”:“康涅狄格州”,
“德”:“特拉华州”,
“DC”:“哥伦比亚特区”,
“佛罗里达州”:“佛罗里达州”,
‘GA’:‘格鲁吉亚’,
‘嗨’:‘夏威夷’,
“ID”:“爱达荷州”,
“IL”:“Illinois”,
‘IN’:‘Indiana’,
“IA”:“爱荷华州”,
“堪萨斯州”:“堪萨斯州”,
“肯塔基州”:“肯塔基州”,
“洛杉矶”:“路易斯安那州”,
“我”:“缅因州”,
“MD”:“马里兰”,
“马”:“马萨诸塞州”,
'米':'密歇根',
“MN”:“明尼苏达州”,
“MS”:“密西西比”,
“密苏里州”,
“MT”:“蒙大拿”,
“NE”:“内布拉斯加州”,
“内华达州”:“内华达州”,
“NH”:“新罕布什尔州”,
“新泽西州”:“新泽西州”,
“NM”:“新墨西哥州”,
“纽约”:“纽约”,
“北卡罗来纳州”:“北卡罗来纳州”,
“ND”:“北达科他州”,
“哦”:“俄亥俄州”,
'
<%= simple_form_for(@user) do |f| %>
<%= f.input :state, as: :select, collection: User::STATES %>
<%= f.button :submit %>
<% end %>
# 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
<%= f.select :state, options_for_select(us_states), class:"form-control", required: true %>