0

我正在使用 Carmen 和 carmen-rails 来进行基于 ajax 的 select-a-country、states-list-populates 设置。我或多或少地使用了他们演示中的代码,而且效果非常好。

除了:我想在几种表格中重复使用我的“地址”部分:订单表格、更新您的地址表格、更新客户地址表格,诸如此类。每个视图中的代码都是相同的。

该示例硬编码状态元素的名称,这对我不起作用。如果我在没有 AJAX 的情况下渲染它,我可以简单地将 FormBuilder 传递给部分,但这不是一个选项。

这是我的部分代码:

<li>
  <label for="country">Country</label>
  <div class="select-wrapper">
    <%= address.country_select :country, {priority: %w(US CA GB), prompt: 'Please select a country'}, class: 'country-select' %>
  </div>
</li>
<li>
  <% if address.object.has_attribute? :address %>
    <%= address.label :address, 'Address' %>
    <%= address.text_field :address %>
  <% else %>
    <%= address.label :street, 'Street' %>
    <%= address.text_field :street %>
  <% end -%>
</li>
<li>
  <%= address.label :city, 'City' %>
  <%= address.text_field :city %>
</li>
<li>
  <label for="province">Province/State</label>
  <div class="select-wrapper">
    <%= render partial: 'shared/subregion_select', locals: { parent_region: address.object.country } %>
  </div>
</li>
<li>
  <%= address.label :zip, 'Postal Code' %>
  <%= address.text_field :zip %>
</li>

这是部分:

<div id="state_code_wrapper">
  <% parent_region ||= params[:parent_region] %>
  <% country = Carmen::Country.coded(parent_region) %>

  <% if country.nil? %>
    <em>Please select a country.</em>
  <% elsif country.subregions? %>
    <%= subregion_select(:order, :state_code, parent_region) %>
  <% else %>
    <%= text_field(:order, :state_code) %>
  <% end %>
</div>

问题是subregion_select(:order, :state, parent_region)-- :order 需要调整以支持 FormBuilder 将创建的任何内容。理想情况下,我希望它是f.subregion_select,但我不知道f通过 AJAX 传递什么。

4

1 回答 1

0

这不是问题的真正解决方案,而是一种解决方法(并且可以说是“正确”的方法)。我已更改 ajax 调用以将子区域获取为 JSON,并使用 jQuery 清除和重建 select 标记中的项目。

以下是重点。这不是最干净的代码,并且有一些警告:

  • 它不能处理上面有多个地址的情况
  • 如果没有要选择的项目,它也不会显示文本字段

对于我的用例,没关系,但您可能需要做其他事情。

subregion_options.json.jbuilder:

json.array! @country.subregions do |region|
  json.name region.name
  json.code region.code
end

地址.js.coffee:

$ ->
  $('select.country-select').change (event) ->
    $country_select = $(this)
    $country_select.attr 'disabled', true

    $region_select = $('select.region-select').first()

    country_code = $(this).val()
    url = "/lookup/subregion_options.json?parent_region=#{country_code}"

    $.getJSON url, (data) ->
      $region_select.find('option').remove()
      $.each data, (index, value) ->
        $region_select.append '<option value=' + value.code + '>' + value.name + '</option>'
      $country_select.attr 'disabled', false
于 2014-05-25T18:41:05.287 回答