2017-06-01 13 views
0

私はユーザーが物理アドレスを入力するために使用するフォームを持っています。GeoCoder gemを使用してその物理アドレスをモデルが提出するときにデータベースに保存できる緯度/経度の値に変換したい作成されたファイルを保存します。GeoCoderをモデルまたはコントローラで使用する必要がありますか?

GeoCoderを使用してデータベースの緯度と経度の値を入力する場所を決定するのに問題があります。私はそれがモデルクラスに入ると思っていましたが、物理アドレスを受け入れる初期化メソッドでそれを行う必要があるかどうかはわかりませんでした。次に、@latitudeと@longitudeの値を設定するために、または単にモデルのattr_accessorを使用して、保存アクションが完了する前にコントローラでこれらの値を設定するよう呼び出すなど、これを行うためのより良い方法や場所があります。

私の主な混乱は、コントローラの新機能と作成方法によるものだと思いますが、あまりないので、リソースのデータを挿入する「保存」の上流でこれを行う方法を理解できませんでしたデータベースに格納します。

+0

推測する前に、readmeを読んでみませんか?ジオコーダーは、ジオコーディングとその逆ジオコーディングを行うように設計されています。 – max

答えて

1

脂肪モデル、スキニーコントローラ、およびサービスオブジェクト全体が対象です。

しかし、「ちょうどそれをやり遂げる」ために、モデルは正常に動作します。

考えられるのは、パスタコードをコピーすることなく、どこでも同じメソッド(この場合はジオコーディングメソッド)を呼び出すことができるということです。あなたが知っているのは、その全体が繰り返されないことです。あなたの(例)で

before_save :if => { |_| self.address_changed? && self.address.present? } do 
    result = Geocoder.search(self.address) 
    self.lat, self.lng = result.lat, result.lng 
end 
+0

あなたの答えに感謝します。とても役に立ちました。ありがとう。 – user3064141

1

GeoCoderを使用してデータベースの緯度と経度の値を入力する場所を決定するのに問題があります。私は間違っていないよ場合

は間違いモデルでは、これはあなたがバックエンドでやっているものだとuserまたはviewまたはcontrollerがit..alsoとは何の関係もありません、それはへのAPI呼び出しを行います別の(たぶんgoogle)サーバーとそのようなロジックはコントローラには存在しません。

は覚えておいてください:シンコントローラおよび脂肪のモデル

どのように?あなたはおそらく、あなたはLAT-long型のために行くの検索に/迅速を必要としない場合、私はdelayed_jobのように非同期的にそれを行うためにあなたをお勧めします

before_create :assign_lat_long 

private 

def assign_lat_long 
    # the logic 
end 

ようbefore_createコールバックを使用することができます

かあなたがすでに使っている他の同様のサービス。基本的にサードパーティAPIのレスポンスから独立しているため、サーバーのUXや応答時間には影響しません。

+0

ありがとうございます。あなたは答えが私の理解に非常に役立った。私は答えとして1つの答えをマークすることしかできませんでしたが、あなたの答えは同じように役立ち、他のものに加えられました。私は答えとして両方をマークすることができたらいいと思う。ありがとう。 – user3064141

1

は、私はあなたがfor.Iはかなり長い時間Geocoderを使用していると、これはそれが何をするかで探しているものについて、少し混乱しています...それはアドレス欄と仮定してaddress.rbすることができ、あなたの場合には.... geocoder宝石を追加しアドレスを保持するmodel宝石を伝える必要があり

  • - あなたが探しているものを含みます他の列もあります - latitudelongitudecitycountry ...など。
  • 上記は、geocoderが他の列に入力するのに役立つその列のアドレス.rbにgeocoded_byを使用することによって達成されます。
  • 論理的にはどこに配置する必要があるのか​​心配する必要はありません。常にモデル内にあり、は保存時にに初期化されます。
  • ですから、controllerであなたのcreateアクションis..inしなければならないすべて...あなたは@address.save ..thisを行うときに、あなたが提出したフォームからparams[:address]フィールドからすべての値を取得するためにgeocoderをトリガします。

アドレスオブジェクトが保存されると、他の値も入力され、必要に応じて使用できます。

これが役に立ちます。

+0

ありがとう。あなたの答えはとても役に立ちました。 – user3064141

関連する問題