Estoy tratando de poner en práctica algo aparentemente muy simple, y he estado golpeando mi cabeza contra ella durante días en este punto.Ruby on Rails País/Estado Seleccione Enigma
El resultado final deseado es un menú desplegable de selección de país, vinculado a un menú desplegable de selección de estado, de modo que cuando se selecciona un país determinado, se conocen los estados IF ENTONCES esos estados se muestran en una selección hacia abajo, y si NO se conocen los estados para ese país, entonces se muestra un campo de texto en su lugar.
Siento que ya casi estoy allí. En este punto, la interfaz generará realmente esa lista de estados según el país de las personas, excepto que se niega a actualizar el menú desplegable dinámicamente.
La parte de mi vista en la país y el estado de ubicación se recoge el siguiente aspecto:
# _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>
El ser parcial que se hace referencia en el DIV es el siguiente:
# _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 %>
Por último, el código de controlador, el cual tiene la intención de actualizar la lista de estados dinámicamente:
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
Ahora , este código se está llamando en el momento apropiado y está generando las listas apropiadas de estados. Por ejemplo, cuando el usuario hace clic en Australia, "Intentar actualizar estados ... País = Australia, estados = Territorio de la Capital Australiana, Nueva Gales del Sur, Territorio del Norte, Queensland, Australia del Sur, Tasmania, Victoria, Australia Occidental" aparece en el proceso del servidor Sin embargo, no actualiza la página y no imprime el "OK" al final. En resumen la línea que está fallando es, sin duda,
page.replace_html "states_div",
:partial => 'states',
:object => states,
:locals => {:form => form_for(@person)}
Nota que la sustitución de esta línea con
page.replace_html 'states_div', "<b>is it working</b>"
reemplaza adecuadamente el div, pero por supuesto no con algo útil.
Puede alguien ayudarme a entender lo que está pasando aquí?
OK, estoy pasando el id a la función update_states y buscando a la persona nuevamente. Pero todavía no está actualizando el formulario de forma dinámica. ¿El problema es que estoy tratando de crear una variable para un formulario? En otras palabras, ¿es "f = form_form (@object)" válido dentro del controlador, y puede pasar esta variable a un parcial? –
Se supone que es "f = form_for (@object)", por supuesto. –
¿De verdad está recibiendo errores o en los registros? Es posible que no le guste el form_for en el render en update_states. Podría valer la pena intentar con: "select: person,: state ..." en lugar de form_for stuff. – Shadwell