質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

4回答

11181閲覧

【Rails】jQueryとAjaxを用いて、市区町村と都道府県の連動プルダウンメニューを作成したい

jusco

総合スコア80

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

3クリップ

投稿2015/08/12 12:11

編集2015/08/13 12:22

入力フォームでよくある、都道府県を選ぶとそれに対応した市区町村が自動で選択されるという仕組みを実装したいです。

現在、都道府県(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で、都道府県や市区町村の文字データとして保存したいです。

どのように記述すればよろしいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Railsで連動プルダウンというサイトでそのものずばりな実装が公開されていました。

「rails 都道府県 プルダウン」で検索しました。

投稿2015/08/12 15:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco

2015/08/13 12:12

ご回答ありがとうございます! 上記ページは参考にし、同様の手段でプルダウンメニューの連動自体は実装できたのですが、これらのvalueを別のカラムに保存する方法がわからないのです・・・
guest

0

javascript

1$(function () { 2 var parent = $(".ajax-pref"); 3 var child = $(".ajax-city"); 4 parent.on("change", function () { 5 var selectedPrefCode = $(this).val(); 6 var param = { 7 pref: selectedPrefCode 8 }; 9 child.html('<option value="-1">-- 市区郡選択 --</option>'); 10 var defaultCityCode = ("" != child.attr("default")) ? child.attr("default") : -1; 11 12 if (-1 != selectedPrefCode) { 13 $.getJSON("/ajax/getcity.php", param, function (json) { 14 $.each(json, function (i) { 15 child.append( 16 '<option value="' + json[i].code + '">' + 17 json[i].name + '</option>'); 18 }); 19 child.val(defaultCityCode); 20 }); 21 } 22 }).change(); 23});

html

1<select name="pref" class="ajax-pref"> 2<option value="-1">都道府県</option> 3<option value="1">北海道</option> 4<option value="2">青森</option> 56<option value="47">沖縄県</option> 7</select> 8 9<select name="city" class="ajax-city"> 10<option value="-1">市区郡</option> 11</select>

利用データはこれ郵便番号データダウンロード

###テーブル定義

sql

1CREATE TABLE `mst_address` ( 2 `officialCode` char(11) NOT NULL DEFAULT '' COMMENT '全国地方公共団体コード(JIS X0401、X0402)', 3 `postalCode5` char(5) NOT NULL DEFAULT '' COMMENT '(旧)郵便番号(5桁)', 4 `postalCode7` char(7) NOT NULL DEFAULT '' COMMENT '郵便番号(7桁)', 5 `kana_pref` varchar(20) NOT NULL COMMENT '都道府県名(カタカナ)', 6 `kana_city` varchar(40) NOT NULL COMMENT '市区町村名(カタカナ)', 7 `kana_town` varchar(40) NOT NULL COMMENT '町域名(カタカナ)', 8 `pref` varchar(20) NOT NULL COMMENT '都道府県名', 9 `city` varchar(40) NOT NULL COMMENT '市区町村名', 10 `town` varchar(40) NOT NULL COMMENT '町域名', 11 `flag_doubleCode` tinyint(1) NOT NULL COMMENT '一町域が二以上の郵便番号で表される場合の表示 (注3) (「1」は該当、「0」は該当せず)', 12 `flag_banchi` tinyint(1) NOT NULL COMMENT '小字毎に番地が起番されている町域の表示 (注4) (「1」は該当、「0」は該当せず)', 13 `flag_chome` tinyint(1) NOT NULL COMMENT '丁目を有する町域の場合の表示 (「1」は該当、「0」は該当せず)', 14 `flag_double_area` tinyint(1) NOT NULL COMMENT '一つの郵便番号で二以上の町域を表す場合の表示 (注5) (「1」は該当、「0」は該当せず)', 15 `flag_update` int(1) NOT NULL COMMENT '更新の表示(注6)(「0」は変更なし、「1」は変更あり、「2」廃止(廃止データのみ使用))', 16 `flag_update_reason` int(1) NOT NULL COMMENT '変更理由 (「0」は変更なし、「1」市政・区政・町政・分区・政令指定都市施行、「2」住居表示の実施、「3」区画整理、「4」郵便区調整等、「5」訂正、「6」廃止(廃止データのみ使用))', 17 KEY `postalCode7` (`postalCode7`), 18 KEY `postalCode5` (`postalCode5`) 19) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

sql

1CREATE TABLE `mst_address_mini` ( 2 `officialCode` int(5) unsigned zerofill NOT NULL COMMENT '全国地方公共団体コード(JIS X0401、X0402)', 3 `pref` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '都道府県名', 4 `city` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '市区町村名', 5 PRIMARY KEY (`officialCode`) 6) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

###マスターデータ更新用スクリプト

bash

1#!/bin/bash 2 3DBUSER= 4DBPASS= 5DBNAME= 6 7echo "Downloading..." 8wget -q http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip 9 10echo 'Melting...' 11unzip -o -q ken_all.zip 12 13echo "Convert SJIS to UTF8" 14nkf -w KEN_ALL.CSV > mst_address.csv 15 16echo 'Importing to MySQL' 17mysqlimport -s -u ${DBUSER} -p${DBPASS} --local --delete --fields-terminated-by=, --fields-enclosed-by="\"" --fields-escaped-by="\\" --lines-terminated-by="\r\n" ${DBNAME} mst_address.csv; 18mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "TRUNCATE mst_address_mini;INSERT INTO mst_address_mini SELECT officialCode, pref, city FROM mst_address GROUP BY officialCode" 19 20# CSV削除 21rm -f KEN_ALL.CSV 22rm -f mst_address.csv 23rm -f ken_all.zip

投稿2015/08/12 14:17

編集2015/08/13 02:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco

2015/08/13 12:10

ご回答ありがとうございます! 言語はPHPでしょうか…? 見慣れないフォーマットのため、参考にできそうにありません・・・ せっかく回答していただいたのに申し訳ありませんm(__)m
退会済みユーザー

退会済みユーザー

2015/08/13 12:15

PHPなんて回答に1行もありませんよ。
jusco

2015/08/15 06:26

SQLが見慣れておらず、勉強不足で申し訳ありません…m(__)m
guest

0

自己解決

追記の記述に加え、
MstCityの:prefecture_idを対応する都道府県名に変更することで対応出来ました!

ご回答いただいた皆様、ありがとうございましたm(__)m

投稿2015/08/15 06:28

jusco

総合スコア80

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問内容と回答内容に認識齟齬がありましたので、削除します。
失礼しました。

投稿2015/08/12 16:14

編集2015/08/12 16:16
shunshun

総合スコア89

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco

2015/08/13 12:10

ご回答ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問