在Rails 3.2应用程序中,我有一对动态选择字段。典型的例子是国家选择,在更改时,将过滤状态选择的选项。这很完美。
但是如果我需要允许用户在列表中添加新状态呢?
这似乎应该是一个相当普遍的案例,但我一直无法找到有关最佳方法的更多信息。我发现的内容与select
标记有关,而我使用的grouped_collection_select
标记更具挑战性。
我想了解其他人的意见和实施类似的经验。在一个非常基础的层面上,你会如何解决这个问题?
例如,我可以通过控制器或javascript在select中添加一个Add New选项(注意,以下表示概念而不是有效代码)。
@state_options = State.all.collect {|so| [ so.country.id, so.id, so.name ] }
@state_options << [nil, nil, "Add New"]
然后检测是否已选择“添加新”:
或者我可以添加一个“添加新”链接:
所以我想知道哪种方法更好,为什么?
我也很感激一些编码的例子。我已尝试使用上面合并的@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的地区。)
coffeescript看起来像这样
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()