Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails选择状态下拉列表?_Ruby On Rails_Ruby_Drop Down Menu - Fatal编程技术网

Ruby on 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'],

我想知道rails是否已经内置了一些功能,这样它就可以创建一个包含所有美国州的选择下拉列表,这样我就不必手动输入了。我在网上搜索过,但没有找到。有什么建议吗?我不必手动输入所有状态?

一些帮助文件

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任务以对db
rake 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 %>