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

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

ただいまの
回答率

90.34%

  • Ruby on Rails

    7667questions

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

  • Google マップ

    386questions

    Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

【Rails5 GoogleMaps】都道府県・市町村など個々のカラムから座標取得Gem「geocoader」で緯度・経度を取得したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 931

besuko

score 10

環境

Ruby2.3.3
Rails5.0.1

Gem

gem 'geocoder'

テーブル例

郵便番号 都道府県 市町村 その他 全住所 緯度 経度
107-0052 東京都 港区赤坂 1-1-1 東京都港区赤坂1-1-1 35.6727516 139.7254066

問題

店舗登録が出来るウェブアプリケーションを作成しています。
これまで全住所カラムに住所を手入力し、Gem「geocoader」を用いて緯度と経度を取得していました。

このたび郵便番号の入力で都道府県と市町村の取得し、番地を手打ちで入力する方式に変更しました。
カラムは「都道府県」「市町村」「その他」と分かれています。

これら「都道府県」「市町村」「その他」を全住所カラムに反映させる方法はありませんでしょうか。
もしくは「都道府県」「市町村」「その他」から直接geocoaderで緯度と経度を取得する方法はありますでしょうか。

Apprication.html.erb

jpostalから住所データを取得しています。

<head>
 <script type="text/javascript" src="//jpostal-1006.appspot.com/jquery.jpostal.js"></script>
</head>

<script type="text/javascript">
$(function() {
  $(window).ready( function() {
    $('#zipcode').jpostal({
      postcode : [
        '#zipcode'
      ],
      address : {
        '#prefecture': '%3',
        '#city'          : '%4',
        '#other'        : '%5',
        '#address'    : '%3%4%%5'
      }
    });
  });
});
</script>

_form.html.erb

hidden_fieldで値を取得できないものかと思いましたが、反映されないので何かが間違っているのかと思います。

<%= form_for @shop do |f| %>
  <%= f.label :zipcode %>
  <%= f.text_field :zipcode, id:'zipcode' %><br>
  <%= f.label :prefecture %>
  <%= f.text_field :prefecture, id:'prefecture' %><br>
  <%= f.label :city %>
  <%= f.text_field :city, id:'city' %><br>
  <%= f.label :street_number %>
  <%= f.text_field :street_number, id:'street_number' %><br>
  <%= f.label :address %>
  <%#= f.hidden_field :address, id:'address' %><br>
  <%= f.text_field :address, id:'address' %><br>
  <%= f.submit "登録", :class => 'btn btn-primary', data: { disable_with: '登録中...' }  %>
<% end %>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

geocoaderがいつのタイミングで発火しているかは存じませんが

shop.rb
before_save: :concat_address
def concat_address
address=[prefecture,city,street_number].join('')
end


とかではダメなのですか?
先にgeocoaderでエラーが出るなら
before_saveを、after_validationに変えるとか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/13 16:25

    moke様

    ご回答頂きありがとうございます。
    geocoaderはafter_validationとしています。
    教えて頂きましたように致しましたがaddress情報は反映されず空欄のまま保存されてます。
    恐れ入りますが結合されたaddessを使う方法を教えて頂けませんでしょうか。。

    shop.rb

    ```Ruby
    before_save :concat_address
    after_validation :geocode, if: :address_changed?

    def concat_address
    address=[prefecture,city,street_number].join('')
    end
    ```

    キャンセル

  • 2017/02/13 16:51 編集

    after_validationの後before_saveが発火しますので
    after_validation :concat_address,:geocode
    とか
    after_validation :concat_address
    after_validation :geocode, if: :address_changed?
    とか
    before_save :geocode, if: :address_changed?
    after_validation :concat_address
    とかして見て良いのを選んでください

    キャンセル

  • 2017/02/16 21:07

    その後、モデル内で結合した値をデータベースに保存する方法が分からずにいましたが、別の方法で解決致しました。

    目的は郵便番号から都道府県と市町村を取得して、それ以降の住所を手打ちで入力したものをgeocoaderで座標を取得するということでした。
    なお都道府県と市町村は検索出来るよう個別のカラムに保存したいと考えていました。
    それで、フォームを以下のように書き換え解決致しました。

    ```
    <!DOCTYPE html>
    <html>
    <head>
    <script type="text/javascript" src="//jpostal-1006.appspot.com/jquery.jpostal.js"></script>
    </head>

    <%= simple_form_for(@shop) do |f| %>
    <%= f.input :zipcode, label: "郵便番号" %>
    <%#= f.input :prefecture, label: "都道府県" %>
       ↓
    <%= f.hidden_field :prefecture %>
    <%#= f.input :city, label: "市町村" %>
       ↓
    <%= f.hidden_field :city %>
    <%= f.input :address,label: "住所" %>
    <% end %>
    <script type="text/javascript">
    $(function() {
    $(window).ready( function() {
    $('#zipcode').jpostal({
    postcode : [
    '#shop_zipcode'
    ],
    address : {
    '#shop_prefecture': '%3',
    '#shop_city' : '%4',
    '#shop_address' : '%3%4'
    }
    });
    });
    });
    </script>
    ```

    ただし今回はたまたま別の方法で解決できましたが、モデル内での結合等は今後も必要になるかと思いますので勉強しておきます。
    お忙しい中ヒントを下さり、また最後までご丁寧にお付き合い頂き本当に有難うございました。

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    7667questions

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

  • Google マップ

    386questions

    Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。