条件付きの国別選択ドロップダウンを開発しました。この動作をアドレスモデルに除外して、動的な動作(ビューとコントローラーの間で多かれ少なかれ分割)を毎回コピーする必要がないようにします。ユーザーが完全なアドレスを入力できるようにしたい。
基本的に、私はつま先をDRYに少し深く浸そうとしています。しかし、ビヘイビアーをどこに埋め込むかは正確にはわかりません。モデルまたはヘルパーを使用して必要なフォームを作成しますか?最も重要なこと:状態のリストを更新するための動的な動作をどこでどのように呼び出すことができますか?アドレスコントローラーが必要ですか、それともモデル内からすべて実行できますか?
言い換えれば、私が今ビューに持っているものは次のようなものです:
# _refine.html.erb
<tr>
<td>
<%= label_tag :dest_country, 'Country: ' %></td><td>
<%= select_tag :dest_country,
options_for_select(Carmen::country_names
<< 'Select a country',
:selected => 'Select a country'),
{:include_blank => true,
:id => 'country_select',
:style => 'width: 180px',
:onchange => remote_function(
:url => {:action => 'update_state_select'},
:with => "'country='+value")} %>
</td>
</tr>
<tr>
<div id="state_select_div">
<td><%= label_tag :dest_state, 'State:   ' %></td>
<td><%= select_tag :dest_state,
options_for_select(Carmen::states('US').collect{
|s| [s[0],s[0]]} << ['Select a state'],
:selected => 'Select a state'),
{:style => 'width: 180px'} %></td>
</div>
</tr>
更新メソッドはコントローラーにあります。
# search_controller.rb
def update_state_select
# puts "Attempting to update states"
states = []
q = Carmen::states(Carmen::country_code(params[:country]))
states = q unless q.nil?
render :update do |page|
page.replace_html("state_select_div",
:partial => "state_select",
:locals => {:states => states }
)
end
end
最後に、固有名または空白のテキストフィールドでドロップインされるパーシャルがあります。
# _state_select.html.erb
<% unless states.empty? or states.nil? %>
<%= label_tag :dest_state, 'Select a state' %>
<br/> <%= select_tag :dest_state,
options_for_select(states.collect{|s| [s[0],s[0]]}
<< ['Select a state'],
:selected => 'Select a state'),
{:style => 'width: 180px'} %>
<% else %>
<%= label_tag :dest_state, 'Please enter state/province' %><br />
<%= text_field_tag :dest_state %>
<% end %>
さて、私がやりたいのは、モデルを介して住所を関連付け(たとえば、Person has_one:address)、新しい人物を作成するためのフォーム内で、次のようなものを使用できるようにすることです。
<%= label_tag :name, 'What's your name?' %>
<%= text_field_tag :name %>
<%= label_tag :address, 'Where do you live?' %>
<%= address_fields_tag :address %>
これにより、適切なドロップダウンが生成され、動的に結合され、その結果にPerson.address.countryおよびPerson.address.stateからアクセスできます。
前もって感謝します!