html的分组选项选择和更新模型

时间:2014-05-16 13:57:08

标签: ruby-on-rails ruby ruby-on-rails-4

我在编辑页面上分别在城市和国家/地区的页面上输入和下拉:

  = f.input :city
  = f.input :country, collection: country_list

这里是如何在服务器上更新的:

  if @my_model.update_attributes(get_permitted_params) #...

我想用一个包含grouped_options_for_select的下拉菜单替换它们,以便同时显示城市和国家/地区:

= f.select(:city, grouped_options_for_select(country_with_cities_list))
  1. 我必须使用什么作为f.select中的第一个参数?它不仅是城市,也不仅仅是国家。这两者都是。
  2. 我是否需要更改任何内容 if @my_model.update_attributes(get_permited_params) #...让它像以前一样运作?

1 个答案:

答案 0 :(得分:1)

您仍然必须使用:city作为该表单字段的第一个参数。

使用grouped_options_for_select倾向于将国家/地区optgroup标签下的城市设置组合在一起。但是,您最终只会选择一个城市的option。例如:

<optgroup label="England">
  <option value="Bedfordshire">Bedfordshire</option>
  <option value="Berkshire">Berkshire</option>
  <option value="Bristol">Bristol</option>
</optgroup>

如果您还必须设置country,则必须在控制器端手动执行此操作。 对于country_with_cities_list,请确保它对应于数组[["England", ["Bedfordshire", "Berkshire", "Bristol"]],...](或它的等效哈希)。

下面的内容(未经测试)可以提供帮助。它将一组城市(及其相应的ID)分组为一个国家/地区:

@cities = City.all(include: country)
country_with_cities_list = @cities.inject({}) do |hash, city|
  (hash[city.country.name] || = []) << [city.name, city.id]
  hash
end