私は一見非常に単純に見えるものを実装しようとしていますが、この時点で何日も頭を悩ませてきました。
私の望む最終結果は、州選択ドロップダウンに関連付けられた国選択ドロップダウンです。これにより、特定の国が選択されたときに、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>
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を適切に置き換えますが、もちろん有用なものではありません。
誰かがここで何が起こっているのかを理解するのを手伝ってくれますか?