Jos*_*man 6 ruby ajax ruby-on-rails rjs
我正在努力实现一些看似非常简单的事情,而且我已经在这几天打了我的脑袋.
我想要的最终结果是国家选择下拉列表,与状态选择下拉列表相关联,这样当选择给定国家/地区时,IF状态已知,然后这些状态将显示在选择下拉列表中,如果对于该国家/地区不知道任何州,然后显示文本字段.
我觉得我快到了.此时,接口实际上将根据人员的国家生成状态列表,除非它拒绝动态更新下拉列表.
我的视图中收集国家和州位置的部分看起来像:
# _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>
Run Code Online (Sandbox Code Playgroud)
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 %>
Run Code Online (Sandbox Code Playgroud)
最后,控制器代码用于动态更新状态列表:
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
Run Code Online (Sandbox Code Playgroud)
现在,在适当的时间调用此代码并生成适当的状态列表.例如,当用户点击澳大利亚时,"尝试更新州...国家=澳大利亚,州=澳大利亚首都直辖区,新南威尔士州,北领地,昆士兰州,南澳大利亚州,塔斯马尼亚州,维多利亚州,西澳大利亚州"出现在服务器进程.但是它不会更新页面,也不会在最后打印"确定".简而言之,失败的路线无疑是
page.replace_html "states_div",
:partial => 'states',
:object => states,
:locals => {:form => form_for(@person)}
Run Code Online (Sandbox Code Playgroud)
请注意,用此替换此行
page.replace_html 'states_div', "<b>is it working</b>"
Run Code Online (Sandbox Code Playgroud)
正确地替换div,但当然没有任何有用的东西.
有人可以帮我理解这里发生了什么吗?
看起来您假设 @person 变量仍然可以从您的原始操作中获得。这可以通过当前人员的过滤器来设置,但您不会在问题中显示这一点。
如果您确实需要再次查找@person,我认为您必须在remote_function 中传递id。
| 归档时间: |
|
| 查看次数: |
8592 次 |
| 最近记录: |