こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

Ruby on Railsで住所自動入力作成したい

よくホームページ等のユーザー登録画面にある、郵便番号を入力してボタンを押すと自動的にテキストボックス内に住所が表示される画面を作成したいのですが、Railsでどのように作成すればよいか分かりません。

どなたか詳しい方いらっしゃいましたらご教示願います。

投稿日時 - 2014-06-25 14:13:27

QNo.8652834

すぐに回答ほしいです

質問者が選んだベストアンサー

だいぶできたようですね。
こちらもMacでOSX10.9ですので、ほぼ同じです。

少し気になる点を、
t.integer :Zip_Code
と整数型になっていますが、0から始まる郵便番号もありますので、
t.stringをした方が良いように思います。
それと、Zip_Codeにインデックスを設定しておく方が検索が速くなります。
インデックスはmigrationでadd_indexで後から設定できます。

実際にやってみて気がついたのですが、
同じ郵便番号で違う住所が結構有るのです。郵便番号から一意に住所が決められないのです。それと
No.2の回答欄にもあるように、
札幌市中央区大通西(1~19丁目)
のようにそのままでは使えない住所があります。

住所録を作成するために使うのだと思うので、
住所録本体(例えばaddress_book)をscaffoldなどで作成します。
当方で作成した住所録は、レコードを新規作成するときに(new)郵便番号だけを入れるフォームにし、ボタンを押すと、住所入力用フォームに飛ぶようにしています。新規作成が二段階になっています。この住所新規作成用のフォームには氏名、住所(郵便番号からリレーションで自動入力)、それと郵便番号から検索された住所(同一郵便番号で複数の住所があったときに参考になるように)を表示するようににしています。
先にも書きましたが、郵便番号から直接住所を特定できないことがあるための対策です。

投稿日時 - 2014-06-30 17:24:49

お礼

返信が大変おそくなってしまい申し訳ございません。
ヒントを元に、ようやく完成いたしました!


(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


このやり方が正しいやり方か分かりませんが、試行錯誤の末なんとか完成しました。
最後までお付き合いいただきましてありがとうございました★
今後はこのアプリを元にさらに改良を重ねてまいりたいと思います。

投稿日時 - 2014-07-05 15:54:38

ANo.3

このQ&Aは役に立ちましたか?

10人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.2

No.1です。
まず、郵便番号のデータベースを作る必要があるのですが、
質問者さんのRubyのプログラムをどの程度書けるのか分かりませんので、まず概略だけを書いておきます、それと
使用しているOSも書いてください。


郵便番号データは
http://www.post.japanpost.jp/zipcode/dl/kogaki.html
から「全国一括」をダウンロードして、基本的な部分だけにしてください。表計算ソフトでもできますし、プログラムを書いてやっても構いません。
最初の方は
600000北海道札幌市中央区以下に掲載がない場合
640941北海道札幌市中央区旭ケ丘
600041北海道札幌市中央区大通東
600042北海道札幌市中央区大通西(1~19丁目)
で必要なデータ、
郵便番号、都道府県名、市区町村名、町域名だけにします。上のような感じです。
これをデータベースに登録します。(テーブル1つに全部読み込ませた方が楽かも)

コンパクトなデータにしたいのでしたら、
都道府県名、市区町村名は重複がいっぱい有りますので、
テーブルを3つに分けています。
都道府県名と全国地方公共団体コードの上位2桁で1つのテーブルを作り
市区町村名と全国地方公共団体コードでテーブルを作り
町域名と全国地方公共団体コード、郵便番号でテーブルを
以上のようにすると、コンパクトになります。こちらではこのように作りました。

このあたりのプログラムもあるのですが、どうしましょうか???

投稿日時 - 2014-06-25 22:52:39

お礼

返信が大変遅くなって申し訳ございません。テーブル作成でつまずいておりました。
とりあえず以下の手順でやっとテーブル作成→データ挿入→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です。

よろしくお願いいたします。

投稿日時 - 2014-06-29 23:14:10

ANo.1

大量の住所を入力する必要があったので、以前簡単なものを作ったことがあります。
今は使っていないのですが、先ほど探した見たら、それらしきものが見つかりました。
郵便番号から住所を探すのは簡単にできました。こちらを知りたいのでしょうか?

それとも、上のことは自力でできるが、表示や入力をかっこよくしたいいうことでしょうか?
こちらは泥臭いことをやっていて一応使えるレベルですが、あまり参考にならないレベルです。

どちらを知りたいのでしょうか?

投稿日時 - 2014-06-25 19:11:32

お礼

>それとも、上のことは自力でできるが、表示や入力をかっこよくしたいいうことでしょうか?

いえいえ、そこまでの事は求めておりません。
当方はRuby on Rails(バージョンは4.0.0)初心者ですので、新規入力、編集、削除の基本的な機能(scaffoldでも出来る機能ですが...)をやっと作る程度のレベルです。
ですので、本当にどのような方法でも構いませんので、住所自動入力機能の作り方をご教示いただけたら幸いです。

よろしくお願いいたします。

投稿日時 - 2014-06-25 21:59:51

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-