如何实现动态的groups_collection_select,用户可以在其中“添加新”?

时间:2012-05-13 06:03:07

标签: jquery ruby-on-rails coffeescript grouped-collection-select

在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"]

然后检测是否已选择“添加新”:

  1. 在保存时,此时会显示一个弹出窗口,供用户填写州名,父母国家和其他详细信息。
  2. 或者在更改时,此时使用javascript显示一些其他字段(更好的用户体验,但如果javascript不存在则需要回退)。
  3. 或者我可以添加一个“添加新”链接:

    1. 显示一个带有新状态窗体的弹出窗口,在保存时,会在状态选择字段上刷新Ajax。
    2. 将状态选择替换为一些文本字段,这些字段在保存父窗体时会内置到新状态中。
    3. 所以我想知道哪种方法更好,为什么?

      我也很感激一些编码的例子。我已尝试使用上面合并的@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()
      

0 个答案:

没有答案