Jak*_*ake 71 ruby ruby-on-rails drop-down-menu
我想知道是否有一些已经内置的功能用于rails,这样它就会创建一个包含所有美国状态的选择下拉列表,所以我不必手动输入它.我在网上搜索但我找不到任何东西.有关如何做的任何建议我不必手动输入所有状态?
the*_*gah 140
一些帮助文件
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
Run Code Online (Sandbox Code Playgroud)
以某种形式
<%= select_tag :state, options_for_select(us_states) %>
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 30
谢谢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
Run Code Online (Sandbox Code Playgroud)
Tin*_*ers 18
为此,我通常使用Carmen和Carmen-Rails宝石.
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'
Run Code Online (Sandbox Code Playgroud)
然后,在您正在编辑:地址模型对象的:state_code字段的表单中为所有美国州创建选择标记...
subregion_select(:address, :state_code, Carmen::Country.coded('US'))
Run Code Online (Sandbox Code Playgroud)
fuz*_*nny 18
这是一个更详细的演练.我正在使用Rails 4:
在helpers文件夹下,我创建了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
Run Code Online (Sandbox Code Playgroud)
在config - > environment下,我将以下内容放在development.rb和production.rb中
config.action_controller.include_all_helpers = true
Run Code Online (Sandbox Code Playgroud)
最后,在我的视图中我放(这是在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"))
Run Code Online (Sandbox Code Playgroud)
"CA"在加载时在下拉菜单中预先选择加利福尼亚州.
注意:我没有使用select_tag
.使用它给了我一个未定义的方法错误select_tag
(select_tag是在Ruby指南中,它怎么可能是未定义的?)使用select
它使它工作.
为了实现这一点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']
]
Run Code Online (Sandbox Code Playgroud)
在我的视图中使用simple_form使用:
<%= simple_form_for(@user) do |f| %>
<%= f.input :state, as: :select, collection: User::STATES %>
<%= f.button :submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我发现使用帮助程序来包含状态有问题.它在创建新记录时非常有效,但如果我想编辑现有记录,我希望在下拉框中预选数据库中的状态.我无法使用帮助器工作.但是如果你创建一个简单的状态表,它确实有效.这对我有用:
生成状态模型文件和数据库表,该表只包含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
Run Code Online (Sandbox Code Playgroud)
并迁移数据库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' }
])
Run Code Online (Sandbox Code Playgroud)
然后运行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'}) %>
Run Code Online (Sandbox Code Playgroud)
Rails表单块中的collection_select帮助器方法格式是f.collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
.如果您希望state_code同时作为下拉框的文本和值,则在第一个select参数和text_method中将:state_name更改为:state_code(请注意文本和值顺序相反).在选项中,我预先选择了"CA",但只对新表单进行了编辑(或者每次都会覆盖CA的值).您可以将其更改为空白{include_blank: true}
或添加提示,{prompt: 'Select State'}
或者将其默认为具有空哈希的选定值或第一个值{}
.如果要使字段成为必需字段,可以将其添加到html选项中{class: 'form-control', required: true}
现在,在表单中,您可以从状态表中填充它,并在编辑记录时预先选择该值.
归档时间: |
|
查看次数: |
36625 次 |
最近记录: |