我的模型如下所示:
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.如何正确编写item_location定义的getter方法? 2. 如何验证 item_location 字段。我创建了 validate_item_location 方法,但不知道当我通过表单发布数据时如何在内部获取 item_location 变量。 3.我的setter方法可以吗?
谢谢!
最佳答案
1) 一个项目可以有多个位置? (在我看来)它应该只有一个,因此将 hasy_many
更改为 has_one
。除非您确实想要拥有多个位置,否则您需要更改 item_location
以从您拥有的列表中选择一个位置。
2 & 3) 如果您通过表单发布数据,则 item_location 将由 item_location=
方法设置。哪个应该(以某种方式)存储项目信息。在您的情况下,它存储从 geo
变量返回的坐标。当 geo.success 为 false 时,您应该引发一些错误以通知用户该值未存储。如果您特别想验证发送到 setter 的值,那么您需要将其存储在类中:@saved_location = str
并使用 @saved_location
进行验证,而不是项目位置。
1 & 3) 通常情况下,setter 和 getter 使用相同的数据(结构)。在您的情况下,您将位置的坐标存储在 setter 中,但返回地址、城市和国家/地区。因此 setter 和 getter 似乎是不兼容的。
希望这些言论对您有所帮助!
关于ruby-on-rails - Rails 验证虚拟属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2063704/