一尘不染

Ruby on Rails国家/州选择“ Enigma”

ajax

我正在尝试实现看似非常简单的东西,并且到目前为止,我一直在反对它。

我希望得到的最终结果是与“国家选择”下拉列表绑定的“国家选择”下拉列表,这样,当选择了给定的国家/地区时,如果知道了状态,则这些状态将显示在选择下拉列表中,如果该国家没有已知的州,然后显示一个文本字段。

我觉得我快到了。此时,该界面实际上将根据人员所在的国家/地区生成该州的列表,除非它拒绝动态更新下拉列表。

我收集国家和州位置的部分视图如下:

# _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,但是当然没有任何有用的东西。

有人可以帮我了解这里发生了什么吗?


阅读 239

收藏
2020-07-26

共1个答案

一尘不染

您似乎在假设@person变量在您的原始操作中仍然可用。可以通过针对当前人员的过滤器进行设置,但您不会在问题中显示出来。

如果确实需要再次查找@person,则必须在我认为的remote_function中传递ID。

2020-07-26