在使用devise
的Rails 5应用程序中,我需要使用new.js.erb
文件来更新注册视图和控制器中的select标记。我似乎不能弄清楚为什么我的new.js.erb
文件不工作。
我尝试在控制器中使用respond_to
,如下所示:
registrations-controller.rb
def new
super
@cities = CS.get(:us,params[:state])
respond_to do |format|
format.js { render '/new.js.erb' }# layout: false }
format.html
end
end
字符串
new.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), :remote => true) do |f| %>
<div class="signup-input-container">
<div class="field">
<%= f.text_field :firstname, autofocus: true, autocomplete: "firstname", placeholder: "First name", class: "signup-input-container--input" %>
</div>
<div class="field">
<%= f.select :state, options_for_select(CS.states(:us).map { |code, name| [name, code] }),{: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>
</div>
<% 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 %>
型
main.js
var state = document.getElementById("state-picker");
state.addEventListener("change", function() {
$.ajax({
url: "/states?state=" + state.value,
type: "GET"
})
})
型
我期待这将创建选择标记选项与我的城市数组在我的控制器。有谁知道怎么让它工作吗?
1条答案
按热度按时间syqv5f0l1#
为了解决这个问题,你应该设置一个单独的控制器,你可以从异步获取数据,或者也有几个免费的API可以用于地理查找,如Googles Geocoding API和Geonames。
要设置一个单独的控制器,您可以通过以下方式完成:
字符串
我会跳过使用
.js.erb
模板,只返回JSON数据,您可以直接在JS中使用或使用许多现有的自动完成解决方案之一。.js.erb
只适用于需要重用服务器端模板的大量HTML模板(例如渲染整个表单)-它大大增加了复杂性,通常会使JavaScript变得一团糟,这不值得输出选项标签列表。型