入力フォームでよくある、都道府県を選ぶとそれに対応した市区町村が自動で選択されるという仕組みを実装したいです。
現在、都道府県(Prefecture クラス)と市区町村(City クラス)に初期データを投入し、1対多のリレーションをもたせるところまでは実装しています。
ここから、他の複数のモデルの入力フォームで、選択した都道府県と市区町村をそれらのモデルのカラムに保存するため、以下の様なフォームを作成しました。
Ruby
1 2 <%= f.label '会社住所' %> 3 <%= f.collection_select :farm_prefectures , Prefecture.all,:name,:name , id: 'prefectureSelect'%> 4 <%= f.collection_select :farm_city , City.all,:name,:name,id: 'citySelect' %> 5 6#:farm_prefectures に都道府県を、:farm_city に市区町村を保存する
調べてみると、ここからjQueryやajaxを使用してプルダウンの変更を読み取る必要があるようなのですが、いろいろ試してみてもうまくいきません。
1・#prefectureSelect が変更したことを .changeで読み取る
2・City.prefecture_id と Prefecture.id が一致するものを表示させる
2・の記述方法がわかりません。
jqueryの記述と、ajax実装についてなるべく具体的なコードを教えていただけますでしょうか。
よろしくお願いいたします。
追記
ご回答してくださった皆様、ありがとうございます。
こちらのページを参考に、以下の様に実装することで確かに連動ボックス自体の実装は確認できました。
しかし、都道府県と市区町村をそれぞれPostクラスのカラムに保存する方法がわかりません。
Ruby
1#view 2<%= form_for @post do |post| %> 3都道府県 <%= post.collection_select :mst_prefecture , MstPrefecture.all,:id,:name %><br /> 4市区町村 <%= render partial: 'shared/cities', locals: { prefecture_id: MstPrefecture.first.id } %> 5#shared/cities 6 7<%= collection_select :post , :mst_city, MstCity.where(prefecture_id: prefecture_id),:id,:name %> 8 9#posts_controller.rb 10def cities_select 11 if request.xhr? 12 render partial: 'shared/cities', locals: { prefecture_id: params[:prefecture_id]} 13 end 14end 15 16#config/routes.rb 17 resources :posts do 18 collection do 19 get :cities_select 20 end 21 end 22 23#posts.coffee 24$(document).on 'change', '#post_mst_prefecture', -> 25 $.ajax( 26 type: 'GET' 27 url: '/posts/cities_select' 28 data: { 29 prefecture_id: $(this).val() 30 } 31 ).done (data) -> 32 $('#post_mst_city').html(data) 33 34#post.rb 35class Post < ActiveRecord::Base 36 belongs_to :mst_prefecture 37 belongs_to :mst_city 38end 39 40# mst_prefecture.rb 41class MstPrefecture < ActiveRecord::Base 42 has_many :mst_cities 43end 44 45# ms_city.rb 46class MstCity < ActiveRecord::Base 47 belongs_to :mst_prefecture 48end
上記の実装だと、確かに都道府県に合わせた市区町村が表示されるようにはなったのですが、それぞれのvalueを、Post.prefecture, Post.city に格納しようと collection_select を弄ると動作しなくなってしまうのです。
また、上記記述ではvalueがidとなってしまっており、データを格納する際にそのデータが数値になってしまいます。
出来れば保存するデータはidではなくnameで、都道府県や市区町村の文字データとして保存したいです。
どのように記述すればよろしいでしょうか。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/13 12:12