在 Rails 3.2 应用程序中,我有一对动态选择字段。这方面的典型示例是国家选择,在更改时将过滤州选择的选项。这是完美的工作。
但是如果我需要允许用户向列表中添加新状态怎么办?
这似乎应该是一个相当普遍的情况,但我一直无法找到有关最佳方法的大量信息。我发现与select
标签有关,而grouped_collection_select
我使用的标签更具挑战性。
我想知道其他人的意见和实施类似事情的经验。在非常基本的层面上,您将如何解决这个问题?
例如,我可以通过控制器或 javascript 在选择中包含一个 Add New 选项(注意,以下指示概念而不是有效代码)。
@state_options = State.all.collect {|so| [ so.country.id, so.id, so.name ] }
@state_options << [nil, nil, "Add New"]
然后检测是否选择了“Add New”:
- 无论是在保存时,都会显示一个弹出窗口供用户填写州名、母国和其他详细信息。
- 或者在更改时,此时会使用 javascript 显示一些附加字段(更好的 UX,但如果 javascript 不存在则需要后备)。
或者我可以包含一个“添加新”链接:
- 显示一个带有新状态表单的弹出窗口,在保存时会在状态选择字段上执行 Ajax 刷新。
- 用一些文本字段替换状态选择,这些文本字段在保存父表单时会内置到新状态中。
所以我想知道哪种方法更好,为什么?
我也会感谢一些编码示例。我已经尝试过上面的合并@state_options
数组,但是在语法上遇到了困难 - syntax error, unexpected '['
,而且我的 javascript 技能不是很先进。
我的代码目前如下所示:
<%= simple_form_for(@address ) do |f| %>
<%= f.collection_select :country_id, Country.order(:name), :id, :name, include_blank: true %>
<%= f.grouped_collection_select :region_id, Country.order(:name), :regions, :name, :id, :name, include_blank: true %>
<% end %>
(如果我走那条路,我会在上面的分组选择中用 @state_options 替换 :regions 。)
咖啡脚本看起来像这样
jQuery ->
states = $('#address_state_id').html()
console.log(states)
$('#address_country_id').change ->
country = $('#address_country_id :selected').text()
escaped_country = country.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1')
options = $(states).filter("optgroup[label=#{escaped_country}]").html()
console.log(options)
if options
$('#address_state_id').html(options)
else
$('#address_state_id').empty()