1

在 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”:

  1. 无论是在保存时,都会显示一个弹出窗口供用户填写州名、母国和其他详细信息。
  2. 或者在更改时,此时会使用 javascript 显示一些附加字段(更好的 UX,但如果 javascript 不存在则需要后备)。

或者我可以包含一个“添加新”链接:

  1. 显示一个带有新状态表单的弹出窗口,在保存时会在状态选择字段上执行 Ajax 刷新。
  2. 用一些文本字段替换状态选择,这些文本字段在保存父表单时会内置到新状态中。

所以我想知道哪种方法更好,为什么?

我也会感谢一些编码示例。我已经尝试过上面的合并@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()
4

0 回答 0