Ajaxで3つのドロップダウンを連動させる。
例)都道府県、区市町村、大字
main.html.erb
<%= f.select :pref_id, Pref.find(:all).collect.map { |i| [ i.name, i.id ] }, { :include_blank => true }, {:onChange => "document.getElementById('pref_value').value = options[selectedIndex].value;"} %> <%= observe_field("address_cond_pref_id", {:update => :city_list, :on => 'change', :url => {:controller => 'addresss', :action => :city_list}, :with => "'pref_id='+value"}) %> <%= observe_field("address_cond_pref_id", {:update => :vill_list, :on => 'change', :url => {:controller => 'addresss', :action => :vill_list}, :with => "'pref_id='+value"}) %> <div id="city_list"> <%= f.select :city_id, City.find(:all).collect.map { |i| [ i.name, i.id ] }, { :include_blank => true } %> </div> <%= observe_field("address_cond_city_id", {:update => :vill_list, :on => 'change', :url => {:controller => 'addresss', :action => :vill_list}, :with => "'city_id='+value"}) %> <div id="vill_list"> <%= f.select :vill_id, Vill.find(:all).collect.map { |i| [ i.name, i.id ] }, { :include_blank => true } %> </div>
city_list.html.erb
<select id="city_id" name="address_cond[city_id]"> <option value=""></option> <% for city in @city_list %> <option value='<%=city.id%>'><%=city.name%></option> <% end %> </select> <%= observe_field(:city_id, {:update => :vill_list, :on => 'change', :url => {:controller => 'addresss', :action => :vill_list}, :with => "'city_id='+value+'&pref_id='+document.getElementById('pref_value').value"}) %>
vill_list.html.erb
<select id="vill_id" name="address_cond[vill_id]"> <option value=""></option> <% for vill in @vill_list %> <option value='<%=vill.id%>'><%=vill.name%></option> <% end %> </select>
mainの初期表示のときにcity_listとvill_listが表示されないので、予めmainに別コンポーネントでcityとvillを設置。
idとかnameはhtmlソースを確認しながら適当に…。
prefを変えたときにvillも変えたいのでcity_listと同じようなobserve_fieldを用意。
ごちゃごちゃと汚い感じのソースになってしまったけれど、なんとなく意図した通りに動いてるっぽい。
ドロップダウンは他の入力コンポーネントと違って色々と面倒なことに最近やっと気づいたので、これからは使用を控える方向にしていきたい。
RMagickで
126: 指定されたモジュールが見つかりません。 -
C:/ruby-1.8.6/lib/ruby/site_ruby/1.8/i386-msvcrt/RMagick2.so
こんなエラーが出たのだが原因がわからずライブラリを入れなおしたら治った。