我的模型看起来像这样:
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!
答案 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)一般来说,实践中,设定者和吸气剂使用相同的数据(结构)。在您的情况下,您将位置的坐标存储在您的设置器中,但返回地址,城市和国家/地区。因此,设定者和吸气剂似乎是不相容的。
希望这些言论有所帮助!