Rails验证虚拟属性

时间:2010-01-14 11:24:40

标签: ruby-on-rails validating virtual-attribute

我的模型看起来像这样:

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变量。  我的setter方法好吗?

THX!

1 个答案:

答案 0 :(得分:3)

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

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

1&amp; 3)一般来说,实践中,设定者和吸气剂使用相同的数据(结构)。在您的情况下,您将位置的坐标存储在您的设置器中,但返回地址,城市和国家/地区。因此,设定者和吸气剂似乎是不相容的。

希望这些言论有所帮助!