关于简单地址簿应用程序的Rails模型的几个问题

时间:2010-03-16 03:21:25

标签: ruby-on-rails ruby model

我有一个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?”那会有用。

非常感谢帮助解决这些问题。我发布了三个与我的模型有关的问题,因为我不确定它们是否阻止了彼此的工作。感谢您阅读我的问题。

2 个答案:

答案 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