2

私のモデルは次のようになります。

class Item < ActiveRecord::Base
  has_many :locations
  validate :validate_item_location

  def item_location
    locations.address+','+locations.city+','+locations.country
  end

  def item_location=(str)
    geo = Geokit::Geocoders::MultiGeocoder.geocode(str)
    if geo.success
      locations.build( :lat => geo.lat, :lng => geo.lng)
    end
  end

  def validate_item_location
    geo = Geokit::Geocoders::MultiGeocoder.geocode( item_location )
    errors.add_to_base("Location is invalid") unless geo.success
  end
end

私の質問 1. getter メソッド item_location を正しく記述する方法を教えてください。2. item_location フィールドを検証するにはどうすればよいですか。validate_item_location メソッドを作成しましたが、フォームからデータを POST するときに内部で item_location 変数を取得する方法がわかりません。3. 私のセッターメソッドは大丈夫ですか?

THX!

4

1 に答える 1

3

1) アイテムは多くの場所を持つことができますか? (私には) 1 つしかないはずなので、 に変更hasy_manyhas_oneます。本当に複数の場所が必要な場合を除きitem_location、リストから 1 つの場所を選択するように変更する必要があります。

2 & 3) フォームからデータを POST すると、メソッドによって item_location が設定されitem_location=ます。(どういうわけか)アイテム情報を保存する必要があります。あなたの場合、geo変数から返された座標を格納します。geo.success値が保存されていないことをユーザーに通知するために、 が false の場合、何らかのエラーを発生させる必要があります。セッターに送信される値を特に検証したい場合は、それを class: に格納し、item_location の代わりに@saved_location = str使用して検証する必要があります。@saved_location

1 & 3) 一般に、setter と getter は同じデータ (構造) を使用するのが慣例です。あなたの場合、セッターに位置の座標を保存しますが、住所、都市、国を返します。したがって、セッターとゲッターは互換性がないようです。

これらのコメントがお役に立てば幸いです。

于 2010-01-14T12:13:02.577 に答える