2016-04-27 8 views
1

私はこれが二重引用符ではないことを願っていますが、これまでのところ満足のいく回答は見つかりませんでした。私はレールの初心者ですので、私に優しくしてください;)ジオコーダの検証のためのコールバックを修正してください。

私たちはジオコーダーの宝石を使用しています。ジオコーダーに渡されている仮想属性として:addressを、:house_number:postal_code:cityという単純な文字列としてラップしたモデルPlaceがあります。 nominatim( - > OSMデータ)を使用してクエリを実行しています。 google APIとは異なり、nominatimは指定されたアドレスが緯度/経度のペアに対応していない場合はnilを返します。彼らは(存在しない)検証エラーを上げて評価になる前に、それ以外の場合は緯度と経度がnilになるのでこれまでのところ、我々のモデルファイルは、私が私を見てきました例のほとんどとは異なり、この

class Place < ActiveRecord::Base 
    has_many :descriptions, :dependent => :delete_all 
    accepts_nested_attributes_for :descriptions 

    geocoded_by :address 
    before_validation :geocode 

    validates :address, presence: true 
    validates :name, presence: true 
    validates :longitude, presence: true, 
         numericality: { less_than_or_equal_to: 90, greater_than_or_equal_to: -90 } 
    validates :latitude, presence: true, 
         numericality: { less_than_or_equal_to: 180, greater_than_or_equal_to: -180 } 
    validates :categories, presence: true 

    def address 
    ["#{self.street} #{self.house_number}", self.postal_code, self.city].join(', ') 
    end 
end 

のように見えるbefore_validation :geocodeを使用しています。 これまでのところ、これは新しい場所を作成するために機能しますが、私のコントローラ内でupdateアクションのために有効になるようにバリデーションを変更することはできません。基本的には、addressに適用された変更が有効かどうか(APIが特定のアドレスに対して緯度/経度のペアを検出したかどうか)を確認したいと考えています。私が見つけたドキュメントを調べると、before_validate :geocode, if: :address_changed?のような条件付きコールバックがありますが、更新リクエストのパラメータは私のモデルの中で利用できないので、私はそれをチェックする手がかりがありません。私はどんなヒントでもうれしいだろう!

編集:以下

受け入れ答えは私のコントローラの内部で、私はupdate代わりのupdate_attributesを使用していたので、すぐに働いていなかった、権利です。

答えて

0

お客様のモデルは、リクエストを更新するためにパラメータを知る必要はありません。あなたの住所を構成する列が変更されたかどうかをチェックすることによって、住所が変更されたかどうかを確認することができます。 addressが列ではありませんので、あなたはそうのようなaddress_changed?を定義する必要があります:

before_validation :geocode, if: :address_changed? 

def address_changed? 
    street_changed? || house_number_changed? || postal_code_changed? || city_changed? 
end 

streethouse_numbercitypostal_codeは、上記のすべてが動作するための列である必要があること。

+0

これは機能しません。私は '* _changed? 'がヘルパーメソッドであると仮定していますか?彼らはどこから来たのか? –

+0

これはヘルパーメソッドではなく、Railsによって定義されています。コンベンションでは、モデルのすべての列に対してインスタンスメソッド「 _changed?」が定義され、その列値が初めて設定された場合、または最後に永続化されてから変更された場合はtrueを返します。 –

+0

ありがとう、ありがとう。コンソールでは、私はこれらのメソッドをテストすることができます、彼らは動作します。それにもかかわらず、条件付きコールバックで使用される提案された 'address_changed?'メソッドのコンテキストでは動作しません。私はまだ、それらがジオコードされずに不正なエントリを '更新 'することができます(エラーが発生します)。何か案が? –

関連する問題