• ベストアンサー

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

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

  • Ruby
  • 回答数3
  • ありがとう数13

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

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

だいぶできたようですね。 こちらもMacでOSX10.9ですので、ほぼ同じです。 少し気になる点を、 t.integer :Zip_Code と整数型になっていますが、0から始まる郵便番号もありますので、 t.stringをした方が良いように思います。 それと、Zip_Codeにインデックスを設定しておく方が検索が速くなります。 インデックスはmigrationでadd_indexで後から設定できます。 実際にやってみて気がついたのですが、 同じ郵便番号で違う住所が結構有るのです。郵便番号から一意に住所が決められないのです。それと No.2の回答欄にもあるように、 札幌市中央区大通西(1~19丁目) のようにそのままでは使えない住所があります。 住所録を作成するために使うのだと思うので、 住所録本体(例えばaddress_book)をscaffoldなどで作成します。 当方で作成した住所録は、レコードを新規作成するときに(new)郵便番号だけを入れるフォームにし、ボタンを押すと、住所入力用フォームに飛ぶようにしています。新規作成が二段階になっています。この住所新規作成用のフォームには氏名、住所(郵便番号からリレーションで自動入力)、それと郵便番号から検索された住所(同一郵便番号で複数の住所があったときに参考になるように)を表示するようににしています。 先にも書きましたが、郵便番号から直接住所を特定できないことがあるための対策です。

do79tama13
質問者

お礼

返信が大変おそくなってしまい申し訳ございません。 ヒントを元に、ようやく完成いたしました! (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 このやり方が正しいやり方か分かりませんが、試行錯誤の末なんとか完成しました。 最後までお付き合いいただきましてありがとうございました★ 今後はこのアプリを元にさらに改良を重ねてまいりたいと思います。

その他の回答 (2)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

No.1です。 まず、郵便番号のデータベースを作る必要があるのですが、 質問者さんのRubyのプログラムをどの程度書けるのか分かりませんので、まず概略だけを書いておきます、それと 使用しているOSも書いてください。 郵便番号データは http://www.post.japanpost.jp/zipcode/dl/kogaki.html から「全国一括」をダウンロードして、基本的な部分だけにしてください。表計算ソフトでもできますし、プログラムを書いてやっても構いません。 最初の方は 600000 北海道 札幌市中央区 以下に掲載がない場合 640941 北海道 札幌市中央区 旭ケ丘 600041 北海道 札幌市中央区 大通東 600042 北海道 札幌市中央区 大通西(1~19丁目) で必要なデータ、 郵便番号、都道府県名、市区町村名、町域名だけにします。上のような感じです。 これをデータベースに登録します。(テーブル1つに全部読み込ませた方が楽かも) コンパクトなデータにしたいのでしたら、 都道府県名、市区町村名は重複がいっぱい有りますので、 テーブルを3つに分けています。 都道府県名と全国地方公共団体コードの上位2桁で1つのテーブルを作り 市区町村名と全国地方公共団体コードでテーブルを作り 町域名と全国地方公共団体コード、郵便番号でテーブルを 以上のようにすると、コンパクトになります。こちらではこのように作りました。 このあたりのプログラムもあるのですが、どうしましょうか???

do79tama13
質問者

お礼

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

大量の住所を入力する必要があったので、以前簡単なものを作ったことがあります。 今は使っていないのですが、先ほど探した見たら、それらしきものが見つかりました。 郵便番号から住所を探すのは簡単にできました。こちらを知りたいのでしょうか? それとも、上のことは自力でできるが、表示や入力をかっこよくしたいいうことでしょうか? こちらは泥臭いことをやっていて一応使えるレベルですが、あまり参考にならないレベルです。 どちらを知りたいのでしょうか?

do79tama13
質問者

お礼

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

関連するQ&A

  • Ruby on Rails について

    Ruby on Railsでアプリケーションを作ります。 バージョンは:InstantRails-2.0-win 1、データベース表の作成: データベース名:myapp   テーブル名:peoples データベースを作成したら、MySQLを再起動します。 2、新規アプリケーションの作成: アプリケーション名:myapp Instant RailsウィンドウのIボタン⇒Rails Applications⇒Manage Rails Applicationsをクリックします。 Rails ApplicationsダイアログボックスのCreate New Rails App・・をクリックします。 コマンドプロンプト画面が表示されます。 rails myapp を入力します。 コマンドプロンプトのプロンプトが入力状態になって、コマンドプロンプトを閉じます。 Rails ApplicationsダイアログボックスのRefresh Listボタンをクリックしたら、myappアプリケーション名が追加されます。 3、アプリケーション・モデルの作成: InstantRails-2.0-winフォルダ ⇒ rails_apps ⇒ myapp ⇒ config ⇒ datebase.yml ファイルを開きます。 ↓に書き換えます。 development: adapter: mysql database: myapp timeout: 5000 username: root host: localhost   Instant RailsウィンドウのIボタン ⇒ Rails Applications ⇒ Open Ruby Console Windowをクリックします。 コマンドプロンプトが開きます。 cd myapp ruby script/generate model people を入力します。 4、コントローラの作成: コマンドプロンプトを開きます。 cd myapp ruby script/generate controller people を入力します。 コマンドプロンプトを閉じます。 InstantRails-2.0-winフォルダ ⇒ rails_apps ⇒ myapp ⇒ app ⇒ controllers ⇒ people_controller.rb ファイルを開きます。 class PeopleController<Application Controller scaffold :people ←←追加した行です。 end 5、新しいアプリケーションを起動 Rails ApplicationsダイアログボックスのRails Applications 欄の myappの所をチェックし、Start with Mongrelボタンをクリックします。 コマンドプロンプト画面が起動し、ポート番号が表示されます。 Webブラウザを起動し、アドレス欄に 一つは: 「http://localhost:people/list」を入力し、Enterキーを押します。 ↓Errorメッセージが表示されました。 NoMethodError in PeopleController#list undefined method `scaffold' for PeopleController:Class RAILS_ROOT: C:/taiyo/INSTAN~1.0-W/rails_apps/myapp   一つは: http://localhost:3000/people Enterキーを押します。 ↓Errorメッセージが表示されました。 NoMethodError in PeopleController#index undefined method `scaffold' for PeopleController:Class RAILS_ROOT: C:/taiyo/INSTAN~1.0-W/rails_apps/myapp どこの手順が違ってるのが解らなくて、 Errorの解決方法ですごく困ってます。 どうかご指導をお願いいたします。 もう一つはErrorメッセージの3行目は C:/taiyo/INSTAN~1.0-W/rails_apps/myappですけど、 InstantRails-2.0-winフォルダのはずですけど、 INSTAN~1.0-Wフォルダになった原因がよくわからないです。 すごく困ってます。 ご指導お願いいたします。

  • Ruby on Railsで入力フォームを作成しています。

    Ruby on Railsで入力フォームを作成しています。 そこで、入力されたid(table.id)と商品名カラム(table.product_id) を結合して商品ID(table.product_number)を 登録時に商品IDカラムに登録できないかと思っています。 商品名カラムは商品テーブルから読み込んでいます。 恐らく、callbackのしくみを利用すればできるのではないかと 思っているのですが、やり方がわかりません。 以上、よろしくお願いします。 環境は以下のとおりです。 ruby1.8.6 rails 2.3.5 db:mysql gems:1.3.5

  • WEBでデータの自動入力

    ホームページにデータ(ユーザーIDとパスワードなど)を入力を促す画面が表示されます。 そこへ、自動でデータを入力するようなことはできるのでしょうか? 例えば、HP上に AAAAAA と表示され、その横にテキストボックスがでているので、AAAAAAを認識して、そのテキストボックスにある値を入れる。 こんなことはできるのでしょうか? ご教示をお願いいたします。

  • Ruby on Railsについて

    Ruby on RailsでWebアプリケーションを作成します。 下記の順でやりました。 1、データベース表を作成。 2、新規アプリケーションの作成。 3、作成したアプリケーションがどのデータベースを使うのかを教える。 4、モデルの作成。 5、コントローラの作成。 6、新しいアプリケーションを起動。 ここでコマンドプロンプト画面内に表示されるポート番号を確認し、 Webブラウザを起動し、 アドレス欄に[http://localhost:ポート番号/アドレスブック/アドレスブックのリスト] を記入しました。 エラーが表示されました。 NoMethodError in PeopleController#list undefined method `scaffold' for PeopleController:Class

  • Ruby on Rails 「attr_accessor」 の使い方に

    Ruby on Rails 「attr_accessor」 の使い方について こんにちは。 現在、Ruby on Railsで登録画面を作成しているのですが、attr_accessorで定義した項目に対して、validationのチェックを行うと、問題が起きてしまいました。 attr_accessorで定義した項目は、DB登録の対象ではないのですが、lengthのチェック等を行う必要があり、validates_length_of等を使って入力チェックを行っています。 問題になったのは、入力があったときだけチェックをかけたいのに、入力がなくてもチェックがかかってしまうという状態になってしまうことです。 「:if => 項目?」を書いてみると、「undefined method」のエラーがでてしまいます。 どなたか対応策の分かる方がおられましたらご教授いただけないでしょうか? 下記に実際の問題箇所のモデルクラスのソースを書いておきます。  class User < ActiveRecord::Base    attr_accessor :NEW_USER_PW ← 追加したアクセサ    # 追加したアクセサに対するチェック    validates_length_of :NEW_USER_PW, :minimum=>4, :message=>"は%d桁以上を設定してくださ                 い。", :on => :update, :if => :NEW_USER_PW?  end 上記のチェック内の「:if => :NEW_USER_PW?」で落ちてしまいます。 入力がないのにチェックに引っかかるとまずいので、入力がないときだけ上記チェックを行えれば良いのですが・・・。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Ruby
  • ruby on railsでフォームに1種類の入力項目を複数作成する方法

    プログラミングの初心者で現在ruby on railsを勉強しています。 その中で複数のエントリーを一括で登録できるようにするサンプルを 探し、railsレシピブック183の技の中にある recipe-101「フォームに1種類の入力項目を複数作成する」 を見つけたのですが、あまり理解できず、うまくいきませんでした。 そこでお願いしたいのですが、 初心者でもわかりやすいサンプルなどが掲載されてる本や ホームページがありましたら教えていただきたいです。 よろしくお願いします。

  • 住所入力の効率化

    明日の朝一番にソフト改善の打ち合せがあるので急いで教えて下さい。m(_ _)m 質問は、郵便番号と住所を入力する別々のフィールドがある入力画面で 郵便番号を入力すると住所のフィールドへ郵便番号辞書(IMEなど)から 住所を自動で入力する方法はありますか? Accessにはあった様に思うのですが・・・・同様のものです。 私はユーザー側なので具体的なコーディングなどは結構ですが 難易度が高いのであれば難易度も教えて下さい。 因みに、DBはOraclです。

  • はがきスタジオの郵便番号自動入力

    こんにちは。 はがきスタジオで会社宛の年賀状を作成しているのですが、 郵便番号を入力しても自動的に住所が出ないものがあります。 私がメモしたときに書き間違ったのかと思って名刺やホームページで公開されているものを確認しても、やっぱり間違っていません。 しかし、ゆうびんホームページで調べても、住所と郵便番号が一致しません。 これはなぜでしょうか? ゆうびんホームページが間違っているとは思い難いので、名刺が間違っているのか?ホームページを更新していないから?でもそれも変ですよね・・・ 会社のみに使用する郵便番号を使用しているということでしょうか? ゆうびんホームページで住所に対応している郵便番号を書くべきか、名刺の方の郵便番号を書くべきか、どうしたらいいでしょうか? ちなみに、はがきスタジオの場合、住所を入力すると自動で郵便番号を検索して入力されてしまうようで、結局名刺と同じ郵便番号にはなりません・・・。

  • フォームメールに入力された郵便番号から住所を自動入力してもらいたい

    ホームページビルダー11で初めてホームページを作成しているものです。 フォームメールで入力の手間やミスを防ぐため、 郵便番号を入力すると、 次の項の都道府県欄や住所欄に 自動的に入力されるようにしたいと思っています。 データは郵便局のサイトで配布しているようですが、、 このデータをどのように使うのか分かりません。 ご存知の方、よろしくお願いいたします。

  • VBAユーザーフォームで郵便番号から住所変換するには?

    会社で顧客リストを作成しているのですが、エクセルではじめてVBAを利用しようと思い、ユーザーフォームを使って連続登録までのマクロコードは入力出来たのですが、テキストボックスに郵便番号を入力すると自動的に次のテキストボックスに住所が入力されるようにするには、どのようなコードを追加すればよいのでしょう?

専門家に質問してみよう