【发布时间】:2010-11-01 20:21:30
【问题描述】:
我正在尝试实现一些看似非常简单的东西,而这几天我一直在努力解决它。
我的期望的最终结果是一个国家选择下拉,绑定到状态选择下拉,以这样的方式,即选择给定的国家/地区时,如果状态是已知的,则在“选择”下拉“中将显示这些状态,并且如果该国家/地区没有已知的州,则会显示一个文本字段。
我觉得我快到了。此时,界面实际上将根据人员的国家/地区生成该状态列表,但它拒绝动态更新下拉列表。
收集国家和州位置的视图部分如下所示:
# _person_setup.html.erb
<td>
<%= f.label :country, 'Select your country' %>*<br />
<%= f.select :country, Carmen::country_names, {},
{:style => 'width: 200px',
:id => 'country_select',
:onchange => remote_function(
:url => {:action => 'update_states'},
:with => "'country='+value")} %>
</td><td>
<p>
<div id="states_div">
<%= render :partial => 'states',
:object => Carmen::states(
Carmen::country_code(
@person.country)),
:locals => {:form => f} %>
</div>
</p>
</td>
DIV中引用的部分如下:
# _states.html.erb
<% unless states.nil? or states.empty? %>
<%= form.label :state, 'Select your state' %>*<br />
<%= form.select :state, states.collect{|s| [s[0], s[0]]} %>
<% else %>
<%= form.label :state, 'Please enter state or province' %>*<br />
<%= form.text_field :state %>
<% end %>
最后,用于动态更新状态列表的控制器代码:
def update_states
puts "Attempting to update states..."
q = params[:country]
states = Carmen::states(Carmen::country_code(q))
puts "Country = #{q}, states = #{states.collect{|s| s[0]}.join(", ")}."
render :update do |page|
page.replace_html "states_div",
:partial => 'states',
:object => states,
:locals => {:form => form_for(@person)}
end
puts "OK"
end
现在,该代码在适当的时间被调用并生成适当的状态列表。例如,当用户单击澳大利亚时,“正在尝试更新州... Country = Australia, states = Australian Capital Territory, New South Wales, Northern Territory, Queensland, South Australia, Tasmania, Victoria, Western Australia”会显示在服务器进程。但是它不会更新页面,也不会在最后打印“OK”。简而言之,失败的路线无疑是
page.replace_html "states_div",
:partial => 'states',
:object => states,
:locals => {:form => form_for(@person)}
请注意,将这一行替换为
page.replace_html 'states_div', "<b>is it working</b>"
适当地替换 div,但当然不是用任何有用的东西。
谁能帮我理解这里发生了什么?
【问题讨论】:
标签: ruby-on-rails ruby ajax rjs