私はこれが二重引用符ではないことを願っていますが、これまでのところ満足のいく回答は見つかりませんでした。私はレールの初心者ですので、私に優しくしてください;)ジオコーダの検証のためのコールバックを修正してください。
私たちはジオコーダーの宝石を使用しています。ジオコーダーに渡されている仮想属性として: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
を使用していたので、すぐに働いていなかった、権利です。
これは機能しません。私は '* _changed? 'がヘルパーメソッドであると仮定していますか?彼らはどこから来たのか? –
これはヘルパーメソッドではなく、Railsによって定義されています。コンベンションでは、モデルのすべての列に対してインスタンスメソッド「 _changed?」が定義され、その列値が初めて設定された場合、または最後に永続化されてから変更された場合はtrueを返します。 –
ありがとう、ありがとう。コンソールでは、私はこれらのメソッドをテストすることができます、彼らは動作します。それにもかかわらず、条件付きコールバックで使用される提案された 'address_changed?'メソッドのコンテキストでは動作しません。私はまだ、それらがジオコードされずに不正なエントリを '更新 'することができます(エラーが発生します)。何か案が? –