- ベストアンサー
Ruby on Railsで住所自動入力作成したい
よくホームページ等のユーザー登録画面にある、郵便番号を入力してボタンを押すと自動的にテキストボックス内に住所が表示される画面を作成したいのですが、Railsでどのように作成すればよいか分かりません。 どなたか詳しい方いらっしゃいましたらご教示願います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
だいぶできたようですね。 こちらもMacでOSX10.9ですので、ほぼ同じです。 少し気になる点を、 t.integer :Zip_Code と整数型になっていますが、0から始まる郵便番号もありますので、 t.stringをした方が良いように思います。 それと、Zip_Codeにインデックスを設定しておく方が検索が速くなります。 インデックスはmigrationでadd_indexで後から設定できます。 実際にやってみて気がついたのですが、 同じ郵便番号で違う住所が結構有るのです。郵便番号から一意に住所が決められないのです。それと No.2の回答欄にもあるように、 札幌市中央区大通西(1~19丁目) のようにそのままでは使えない住所があります。 住所録を作成するために使うのだと思うので、 住所録本体(例えばaddress_book)をscaffoldなどで作成します。 当方で作成した住所録は、レコードを新規作成するときに(new)郵便番号だけを入れるフォームにし、ボタンを押すと、住所入力用フォームに飛ぶようにしています。新規作成が二段階になっています。この住所新規作成用のフォームには氏名、住所(郵便番号からリレーションで自動入力)、それと郵便番号から検索された住所(同一郵便番号で複数の住所があったときに参考になるように)を表示するようににしています。 先にも書きましたが、郵便番号から直接住所を特定できないことがあるための対策です。
その他の回答 (2)
- ki073
- ベストアンサー率77% (491/634)
No.1です。 まず、郵便番号のデータベースを作る必要があるのですが、 質問者さんのRubyのプログラムをどの程度書けるのか分かりませんので、まず概略だけを書いておきます、それと 使用しているOSも書いてください。 郵便番号データは http://www.post.japanpost.jp/zipcode/dl/kogaki.html から「全国一括」をダウンロードして、基本的な部分だけにしてください。表計算ソフトでもできますし、プログラムを書いてやっても構いません。 最初の方は 600000 北海道 札幌市中央区 以下に掲載がない場合 640941 北海道 札幌市中央区 旭ケ丘 600041 北海道 札幌市中央区 大通東 600042 北海道 札幌市中央区 大通西(1~19丁目) で必要なデータ、 郵便番号、都道府県名、市区町村名、町域名だけにします。上のような感じです。 これをデータベースに登録します。(テーブル1つに全部読み込ませた方が楽かも) コンパクトなデータにしたいのでしたら、 都道府県名、市区町村名は重複がいっぱい有りますので、 テーブルを3つに分けています。 都道府県名と全国地方公共団体コードの上位2桁で1つのテーブルを作り 市区町村名と全国地方公共団体コードでテーブルを作り 町域名と全国地方公共団体コード、郵便番号でテーブルを 以上のようにすると、コンパクトになります。こちらではこのように作りました。 このあたりのプログラムもあるのですが、どうしましょうか???
お礼
返信が大変遅くなって申し訳ございません。テーブル作成でつまずいておりました。 とりあえず以下の手順でやっとテーブル作成→データ挿入→HTML画面作成まで行きました。 以下の手順で操作しました。 (1)コンソール画面より新規作成 rails new address (2)ディレクトリをaddressに移動 cd address (3)zipモデルを作成 rails g model zip (4)address/db/migrateの下にできた2014********_create_zips.rbを以下のように作成。 class CreateZips < ActiveRecord::Migration def change create_table :zips, id: false do |t| t.integer :Jis_Code t.integer :Old_Zip_Code t.integer :Zip_Code t.string :State_Kana t.string :City_Kana t.string :Address_Kana t.string :State t.string :City t.string :Address t.integer :AUX1 t.integer :AUX2 t.integer :AUX3 t.integer :AUX4 t.integer :AUX5 t.integer :AUX6 end end end (5)「rake db:migrate」コマンドを実行。 sqliteへzipテーブル作成。 (6)KEN_ALL.CSVをホームページよりダウンロード後、ファイルの文字コードをutf-8に変換。 (これをやらないとこの後の手順でrake aborted!とエラーメッセージが表示されます。) (7)KEN_ALL.CSVをaddress/dbの下に配置 (8)address/db/seeds.rbを編集 require 'csv' CSV.foreach("db/KEN_ALL.CSV") do |row| h = { Jis_Code: row[0], Old_Zip_Code: row[1], Zip_Code: row[2], State_Kana: row[3], City_Kana: row[4], Address_Kana: row[5], State: row[6], City: row[7], Address: row[8], AUX1: row[9], AUX2: row[10], AUX3: row[11], AUX4: row[12], AUX5: row[13], AUX6: row[14] } p h Zip.create!(h) end (9)「rake db:seed」コマンドでcsvファイルをインポート(約10分かかりました) ***これでやっとsqlite3によるzipテーブルの作成ができました。*** 続いて表示するための画面作りをしました。 (10)まずコントローラーの作成 rails g controller zip (11)ルーティングの設定 address/config/routes.rbを以下のように編集 Rails.application.routes.draw do root to: "zip#index" end (12)htmlファイル作成 address/app/views/zipの下に「index.html.erb」を新規作成。 このファイルを以下のように書きました。 <h1>郵便番号から住所を検索する</h1> <%= form_tag do %> 郵便番号を入力してください<br> <%= text_field_tag(:zipcode) %> <%= submit_tag("郵便番号から自動入力") %> <%= text_field_tag(:address) %> <% end %> やっとここまできましたがこのzipモデルとどう結びつけてかけばよいかわかりません。。ここまで来るとあと一歩というところだと思いますが、ここからつまずいております。 ちなみに当方の開発環境はruby 2.0.0p451, rails 4.1.1 OSはMACです。 よろしくお願いいたします。
- ki073
- ベストアンサー率77% (491/634)
大量の住所を入力する必要があったので、以前簡単なものを作ったことがあります。 今は使っていないのですが、先ほど探した見たら、それらしきものが見つかりました。 郵便番号から住所を探すのは簡単にできました。こちらを知りたいのでしょうか? それとも、上のことは自力でできるが、表示や入力をかっこよくしたいいうことでしょうか? こちらは泥臭いことをやっていて一応使えるレベルですが、あまり参考にならないレベルです。 どちらを知りたいのでしょうか?
お礼
>それとも、上のことは自力でできるが、表示や入力をかっこよくしたいいうことでしょうか? いえいえ、そこまでの事は求めておりません。 当方はRuby on Rails(バージョンは4.0.0)初心者ですので、新規入力、編集、削除の基本的な機能(scaffoldでも出来る機能ですが...)をやっと作る程度のレベルです。 ですので、本当にどのような方法でも構いませんので、住所自動入力機能の作り方をご教示いただけたら幸いです。 よろしくお願いいたします。
お礼
返信が大変おそくなってしまい申し訳ございません。 ヒントを元に、ようやく完成いたしました! (1)新規作成 rails new address_book (2)ディレクトリ移動 cd address_book (3)scaffold作成 rails g scaffold member name:string Zip_code:string Address:string (4)zipsコントローラーの作成 rails g controller zips (5)Zipモデルの作成 rails g model Zip address/db/migrate/201407********_create_zips.rbを編集 class CreateZips < ActiveRecord::Migration def change create_table :zips do |t| t.string :Zip_Code t.string :State t.string :City t.string :Address end add_index :zips, :Zip_Code end end (6)データファイルの準備 1.郵便局のホームページよりCSVファイル(KEN_ALL.CSV)をダウンロード 2.CSVファイルをUTF8に変換する 3.address/dbの下にファイルを配置する 4.address/db/seeds.rbを以下のように編集 require 'csv' CSV.foreach("db/KEN_ALL.CSV") do |row| h = { Zip_Code: row[2], State: row[6], City: row[7], Address: row[8] } print h Zip.create(h) end (7)テーブルの作成 rake db:migrate (8)データのインポート rake db:seed (10分以上待つ) (9)memberモデルの編集 address/app/models/member.rb class Member < ActiveRecord::Base has_one :zips end (10)Zipモデルの編集 address/app/models/zip.rb class Zip < ActiveRecord::Base belongs_to :member end (11)membersコントローラーの編集 address/app/controllers/members_controller.rb のcreateメソッドとupdateメソッドを以下のように修正。 def create if params[:serach] # serachボタンが押された場合の処理 zip=Zip.where("Zip_Code = ?", params[:member][:Zip_code]).all zip.each do |z| @State=z[:State] @City=z[:City] @Address=z[:Address] end @Addresses=@State + @City + @Address #logger.debug(@Addresses) @member = Member.new(name: params[:member][:name], Zip_code: params[:member][:Zip_code], Address: @Addresses) render :new else #登録ボタンが押されたときの処理 @member = Member.new(member_params) respond_to do |format| if @member.save format.html { redirect_to @member, notice: 'Member was successfully created.' } format.json { render :show, status: :created, location: @member } else format.html { render :new } format.json { render json: @member.errors, status: :unprocessable_entity } end end end end def update if params[:serach] # serachボタンが押された場合の処理 zip=Zip.where("Zip_Code = ?", params[:member][:Zip_code]).all zip.each do |z| @State=z[:State] @City=z[:City] @Address=z[:Address] end @Addresses=@State + @City + @Address #logger.debug(@Addresses) @member = Member.new(name: params[:member][:name], Zip_code: params[:member][:Zip_code], Address: @Addresses) render :edit else #登録ボタンが押されたときの処理 respond_to do |format| if @member.update(member_params) format.html { redirect_to @member, notice: 'Member was successfully updated.' } format.json { render :show, status: :ok, location: @member } else format.html { render :edit } format.json { render json: @member.errors, status: :unprocessable_entity } end end end end (12)viewファイルの編集 address/app/views/members/_form.html.erbを編集 <div class="field"> <%= f.label :Zip_code %><br> <%= f.text_field :Zip_code %> <%= f.submit("search",:name=>"serach",:id=>"serach") %> ←*これを追加 </div> (13)サーバーを立ち上げる rails s このやり方が正しいやり方か分かりませんが、試行錯誤の末なんとか完成しました。 最後までお付き合いいただきましてありがとうございました★ 今後はこのアプリを元にさらに改良を重ねてまいりたいと思います。