我有一个Rails应用程序,列出了有关本地服务的信息。我对此模型的目标如下:1。需要name和tag_list字段。 2.需要一个或多个tollfreephone,phone,phone2,移动,传真,电子邮件或网站字段。 3.如果paddress字段有值,则使用Geokit插件对其进行编码。这是我的entry.rb模型:
class Entry < ActiveRecord::Base
validates_presence_of :name, :tag_list
validates_presence_of :tollfreephone or :phone or :phone2 or :mobile or :fax or :email or :website
acts_as_taggable_on :tags
acts_as_mappable :auto_geocode=>{:field=>:paddress, :error_message=>'Could not geocode physical address'}
before_save :geocode_paddress
validate :required_info
def required_info
unless phone or phone2 or tollfreephone or mobile or fax or email or website
errors.add_to_base "Please have at least one form of contact information."
end
end
private
def geocode_paddress
#if paddress_changed?
geo=Geokit::Geocoders::MultiGeocoder.geocode (paddress)
errors.add(:paddress, "Could not Geocode address") if !
geo.success
self.lat, self.lng = geo.lat,geo.lng if geo.success
#end
end
end
要求姓名和tag_list工作,但需要一个(或多个)tollfreephone,phone,phone2,mobile,fax,email或website字段。
对于使用Geokit进行编码,为了使用模型保存记录,我必须输入一个地址。这不是我想要的行为。我希望它不需要paddress字段,但如果paddress字段确实有值,它应该编码地理编码。就目前而言,它总是试图对传入的条目进行地理编码。注释掉“if paddress_changed?”没有工作,我找不到像“如果paddress_exists?”那会有用。
非常感谢帮助解决这些问题。我发布了三个与我的模型有关的问题,因为我不确定它们是否阻止了彼此的工作。感谢您阅读我的问题。
答案 0 :(得分:3)
我在您的代码中看到以下问题:
1)重复存在检查
2)同时进行自动和手动地理编码。
以下是可能有效的代码版本:
class Entry < ActiveRecord::Base
acts_as_mappable
acts_as_taggable_on :tags
validates_presence_of :name, :tag_list
validate :required_info
before_save :geocode_paddress
private
def required_info
if( phone.empty? and phone2.empty? and tollfreephone.empty? and
mobile.empty? and fax.empty? and email.empty? and
website.empty?
)
errors.add_to_base "Please have at least one form of contact information."
end
end
def geocode_paddress
# if paddress is nil or empty set the old values to nil and return
((self.lat = self.lng = nil); return true) if paddress.empty?
g=Geokit::Geocoders::MultiGeocoder.geocode(paddress)
(errors.add(:paddress,"Could not Geocode address");
return false) unless g.success
self.lat, self.lng = g.lat, g.lng
end
end
修改强>
required_info
验证失败,因为表单提交的输入数据包含缺少字段的空字符串而不是空值。因此phone or phone2 etc.
检查始终返回true。我已更改验证代码以解决此边缘情况。我很确定它现在会起作用。
<强> PS:强> 这是您应该使用调试器的典型方案。下载并使用任何免费的IDE,如Aptana Radrails或Netbeans。熟悉该工具后,您将能够轻松地调试此类问题。
答案 1 :(得分:0)
我这里没有红宝石,但我很确定你不能用validates_presence_of做到这一点。
您需要执行以下操作:
validates_presence_of:tollfreephone,:unless =&gt; some_method_to_tell_if_other_methods_are_there
至于地理编码方法,也许只是检查它是否为零?类似的东西:
def geocode_paddress
if paddress != nil
geo = Geokit::Geocoders::MultiGeocoder.geocode (paddress)
if geo.success
self.lat, self.lng = geo.lat,geo.lng
else
errors.add(:paddress, "Could not Geocode address")
end
end
end