用于选择动态表单字段的咖啡脚本在Firefox中不起作用

时间:2014-09-13 12:43:39

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

我有一个传统的Rails 3.2.14应用程序,我试图通过关联,groups_collection_select和一些CoffeeScript来按区域约束设施列表。我原来的问题在这里:CoffeeScript to dynamically change form field on change and load。在一些帮助下,我们能够最初解决问题并实现以下行为。

On Call创建一个区域,并且设施受它们所属区域的约束,该字段称为transfer_from_id。使用未在Facility模型中列出的地址创建呼叫时,我们使用transfer_from_other字段输入地址。当发生这种情况时,transfer_from_id字段有意留空,并注入NIL以防止CoffeeScript自动填充模型中的第一个工具。

当编辑其中transfer_from_id包含值的调用时,transfer_from_id将以表单中的设施名称显示。

最初,下面的代码在Chrome中完美运行,但是当我在测试中测试Firefox中的行为时,即使我们在CoffeeScript中添加了一个空白选项,它也会使用列表中的第一个工具自动填充transfer_from_id字段。编辑呼叫时,会发现相同的行为。

我想弄清楚如何在Firefox中修复此问题,因为我们使用此应用程序跨平台/浏览器。我真的希望这个功能正常运行,但我不知道为什么它在Firefox中不起作用。我已经使用了firebug来尝试调试它,但我没有在控制台中看到任何错误。

以下是我的代码库的摘录,可能有助于说明我正在尝试做的事情:

调用/ _form.html.erb摘录

  <%= f.label :region %>
  <%= f.collection_select(:region_id, Region.all, :id, :area, {:include_blank => true}, {:class => 'select', required: true}) %>
  <%= f.label :caller_name %>
  <%= f.text_field :caller_name, :placeholder => 'Jane Smith', required: true %>
  <%= f.label :caller_phone %>
  <%= f.text_field :caller_phone, :placeholder => 'xxx-xxx-xxxx', required: true %>
  <%= f.label :Transfer_From %>
  <%= f.grouped_collection_select :transfer_from_id, Region.order(:area), :active_facilities, :area, :id, :facility_name, {include_blank: true}, class: 'select' %>
  <%= f.label :Transfer_From_Other%>
  <%= f.text_field :transfer_from_other %>
  <%= f.label :Location_Of_Patient %>
  <%= f.text_field :facility_from_location %>
  <%= f.label :Transfer_To %>
  <%= f.grouped_collection_select :transfer_to_id, Region.order(:area), :active_facilities, :area, :id, :facility_name, {include_blank: true}, class: 'select' %>
  <%= f.label :Transfer_To_Other %>
  <%= f.text_field :transfer_to_other %>

calls.js.coffee

jQuery ->
  facilities = $('#call_transfer_from_id').html()

  update_facilities = ->
    region = $('#call_region_id :selected').text()
    options = $(facilities).filter("optgroup[label=#{region}]").html()

    if options
      # Set the options
      $('#call_transfer_from_id').html(options)
      # Add in a blank option at the top
      $('#call_transfer_from_id').prepend("<option value=''></option>")
    else
      $('#call_transfer_from_id').empty()      

  $('#call_region_id').change ->
    update_facilities()

  update_facilities()

facility.rb

belongs_to :region
scope :active, where(status: "Active").order('facility_name ASC')

region.rb

  has_many :facilities

  def active_facilities 
    self.facilities.active
  end

我是CoffeeScript的新手,我的JS / jQuery技能现在不是很尖锐所以我可以使用一些帮助来实现跨浏览器的工作。非常感谢任何提示或建议。我希望这不是一个重复的问题,如果我的问题不明确或者您需要更多信息,请随时告诉我。

1 个答案:

答案 0 :(得分:0)

经过一些黑客攻击和反复试验后,我能够对所有浏览器中都适用的CoffeeScript进行编辑。似乎prepend方法在最新版本的Firefox中无法正常运行,因此我添加了一个空白选项,然后将设施选项数组添加到一行中。

jQuery ->
  facilities = $('#call_transfer_from_id').html()

  update_facilities = ->
    region = $('#call_region_id :selected').text()
    options = $(facilities).filter("optgroup[label=#{region}]").html()

    if options
      # Set the options and include a blank option at the top
      $('#call_transfer_from_id').html("<option value=''></option>" + options)
      # Ensure that the blank option is selected
      $('#call_transfer_from_id').attr("selected", "selected")
    else
      $('#call_transfer_from_id').empty()

  $('#call_region_id').change ->
    update_facilities()

  update_facilities()