Próbuję zaimplementować coś na pozór bardzo prostego, a ja przez wiele dni walczę z tym w tej kwestii.Ruby on Rails Kraj/Państwo Wybierz Enigma
Moim pożądanym wynikiem końcowym jest lista rozwijana Kraj, powiązana z listą wyboru stanu, w taki sposób, że gdy wybrany jest kraj, stany IF są znane, ALE te stany są wyświetlane w kropli w dół i jeśli dla tego kraju nie są znane stany NIE, zamiast tego wyświetlane jest pole tekstowe.
Czuję, że już prawie jestem. W tym momencie interfejs wygeneruje tę listę stanów na podstawie kraju danej osoby, z tym że odmawia dynamicznej aktualizacji listy rozwijanej.
Część mojego widoku, w którym kraj i stan lokalizacja zbierane wygląda następująco:
# _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>
Częściowa istota mowa w DIV jest w następujący sposób:
# _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 %>
Wreszcie kod kontrolera, który jest przeznaczony do dynamicznej aktualizacji listy stanów:
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
Teraz , ten kod jest wywoływany we właściwym czasie i generuje odpowiednie listy stanów. Na przykład, gdy użytkownik kliknie w Australii, "Próba aktualizacji stanów ... Kraj = Australia, stany = Australijskie Terytorium Stołeczne, Nowa Południowa Walia, Terytorium Północne, Queensland, Australia Południowa, Tasmania, Wiktoria, Zachodnia Australia" pojawia się w proces serwera. Jednak nie aktualizuje strony i nie wydrukuje "OK" na końcu. W skrócie linia, która zawodzi jest niewątpliwie
page.replace_html "states_div",
:partial => 'states',
:object => states,
:locals => {:form => form_for(@person)}
Zauważ, że zastąpienie tej linii z
page.replace_html 'states_div', "<b>is it working</b>"
właściwie zastępuje div, ale oczywiście nie z niczego użytecznego.
Czy ktoś może mi pomóc zrozumieć, co się tutaj dzieje?
OK, przekazuję identyfikator do funkcji update_states i ponownie sprawdzam osobę. Ale nadal nie aktualizuje formularza dynamicznie. Czy problem polega na tym, że próbuję utworzyć zmienną dla formularza? Innymi słowy, "f = form_form (@object)" jest poprawny w kontrolerze i czy możesz przekazać tę zmienną do częściowej? –
Oczywiście ma to być "f = form_for (@ Object)". –
Czy rzeczywiście otrzymujesz jakiekolwiek błędy z powrotem lub w dziennikach? Możliwe, że nie podoba się form_for w renderowaniu w punkcie_aktualizacji. Może warto spróbować: "wybierz: osoba,: stan ..." zamiast form_do rzeczy. – Shadwell