【问题标题】:using the city-state gem in rails在 rails 中使用城邦 gem
【发布时间】:2019-01-08 10:47:28
【问题描述】:

大家好,我目前正在设计一个注册表单,最终目标是用户可以从美国选择一个州,下面的选择标签将填充该州的正确城市。我正在使用城邦宝石。 https://github.com/loureirorg/city-state

我查看了类似这样的其他示例https://forum.upcase.com/t/dependent-country-city-state/7038我的代码在下面

routes.rb

resources :states, only: :new 

registrations.new.html.erb

   <div class="field">
        <%= f.select :state, options_for_select(CS.states(:us)), {:prompt => "State"}, {:class => "signup-input-container--input", :id => "state-picker"} %>
   </div>
   <div class="field">
        <%= f.select :city, options_for_select([]),{}, {:class => "signup-input-container--input", :id => "city-picker"} %>
   </div>

ma​​in.js

 document.addEventListener("turbolinks:load", function(){
  var state = document.getElementById("state-picker");
  state.addEventListener("change", function() {
    Rails.ajax({
     url: "/states?country=" + "United States" + "&state=" + 
     state.value,
     type: "GET"
    })
  })
});

registrations-controller.erb

 def new
  super
  @cities = CS.get(:us, params[:state])
 end

new.js.erb

    var city = document.getElementById("city-picker");

    while (city.firstChild) city.removeChild(city.firstChild);

    var placeholder = document.createElement("option");
    placeholder.text = "Choose a city";
    placeholder.value = "";
    city.appendChild(placeholder);

   <% @cities.each do |c| %>
     city.options[city.options.length] = new Option('<%= c %>');
   <% end %>  

我试图让它按照示例链接显示的方式工作。唯一的区别是用户只会从美国和城市中选择州

【问题讨论】:

  • 出了什么问题?你已经描述了你做了什么,但没有描述什么是行不通的。您是否发现 JavaScript 错误?服务器端错误?你有任何错误吗?
  • 感谢@philnash 的快速回复我没有收到任何错误,当我从下拉列表中选择一个州时,城市选择标签中没有填充任何内容
  • 你的 JavaScript change 事件会触发吗?
  • 是的,它会在控制台“GET localhost:3000/states?country=UnitedStates&state=Arizona 404 (Not Found)”中触发并拍摄它
  • 啊,好的,所以我们有一个 404。rails routes 说明您请求状态的端点在哪里?我看到您将其作为注册控制器中new 操作的一部分?那是最好的地方吗?

标签: ruby-on-rails ruby


【解决方案1】:

根据我们在 cmets 中的讨论,问题似乎是您为您的城市请求的 URL 错误。

您在/states/new 有一条路线,但正在向/states 发出请求。尝试将您的 main.js 更新为:

 document.addEventListener("turbolinks:load", function(){
  var state = document.getElementById("state-picker");
  state.addEventListener("change", function() {
    Rails.ajax({
     url: "/states/new?state=" + state.value,
     type: "GET"
    })
  })
});

(我删除了 URL 中的国家/地区参数,因为您似乎没有使用它,您说反正美国只需要这个。)

让我知道你是怎么做的。

【讨论】:

  • 我仍然收到 404 错误,我认为这是因为路线而发生的,我很困惑
  • 如果您直接向/states/new?state=CA(例如)提出请求会怎样?
  • ahhhh 我得到“未初始化的常量 StatesController”,我认为我的问题是尝试在设计注册控制器中使用它
  • 对,这可以追溯到我之前的问题,即为什么您在注册控制器中有这个问题。可能您需要这些数据进行注册,但是调用独立的StatesController 来获取状态列表会更有意义。我会创建一个StatesController 并将动作和.js.erb 视图移到其中。我可能也会使用index 操作而不是新操作。
  • 我认为我越来越近了,我将 get 'states/' 添加到:'families/registrations#new' 到我的路线我现在收到 500 错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多