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 方法,但是当我通过表单发布数据时,不知道如何获取 item_location 变量。3.我的setter方法可以吗?

谢谢!

4

1 回答 1

3

1) 一个项目可以有多个位置?似乎(对我来说)它应该只有一个,所以hasy_many改为has_one. 除非您真的想拥有多个位置,否则您需要更改item_location为从您拥有的列表中选择一个位置。

2 & 3) 如果您通过表单发布数据,则 item_location 由该item_location=方法设置。哪个应该(以某种方式)存储项目信息。在您的情况下,它存储从geo变量返回的坐标。您应该提出一些错误,当geo.success为 false 时通知用户该值未存储。如果您特别想验证发送到 setter 的值,则需要将其存储在类中:@saved_location = str并用于@saved_location验证,而不是 item_location。

1 & 3) 通常,setter 和 getter 使用相同的数据(结构)。在您的情况下,您将位置的坐标存储在您的设置器中,但返回地址、城市和国家/地区。因此,setter 和 getter 似乎不兼容。

希望这些言论有所帮助!

于 2010-01-14T12:13:02.577 回答