我正在尝试实现看似非常简单的东西,并且到目前为止,我一直在反对它。
我希望得到的最终结果是与“国家选择”下拉列表绑定的“国家选择”下拉列表,这样,当选择了给定的国家/地区时,如果知道了状态,则这些状态将显示在选择下拉列表中,如果该国家没有已知的州,然后显示一个文本字段。
我觉得我快到了。此时,该界面实际上将根据人员所在的国家/地区生成该州的列表,除非它拒绝动态更新下拉列表。
我收集国家和州位置的部分视图如下:
# _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
现在,将在适当的时候调用此代码并生成适当的状态列表。例如,当用户单击澳大利亚时,“尝试更新州…国家=澳大利亚,州=澳大利亚首都特区,新南威尔士州,北领地,昆士兰州,南澳大利亚州,塔斯马尼亚州,维多利亚州,西澳大利亚州”显示在服务器进程。但是,它不会更新页面,并且不会在最后打印“ 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,但是当然没有任何有用的东西。
有人可以帮我了解这里发生了什么吗?
您似乎在假设@person变量在您的原始操作中仍然可用。可以通过针对当前人员的过滤器进行设置,但您不会在问题中显示出来。
如果确实需要再次查找@person,则必须在我认为的remote_function中传递ID。