1

I am using geocoder and have a model called Location. This models contains longitude, latitude, and address. What I would like is to give the option to the user to fill in either longitude and latitude or the address. If one of them is fill up then fill up the remaining information. So here what I did

  before_validation :check
  def check
    if self.address.blank?
        reverse()
    else
        geo()
    end
  end

  def reverse
    reverse_geocoded_by :latitude, :longitude,
    :address => :address
    after_validation :reverse_geocode
  end

  def geo
    geocoded_by :address
    after_validation :geocode
  end

But i am getting the following undefined method reverse_geocoded_by I am not sure what to do!

4

1 回答 1

3

您不能在实例方法中调用类方法。请记住,这geocoded_by可能是为您的模型类定义的。您不能在不影响模型的所有实例的情况下任意更改一个实例的验证,因此这通常被视为一个坏主意。

您最好拥有一个可以以两种不同方式之一进行地理编码的“位置”模型,并为每种编码类型创建一个子类。也就是说,可以为这些中的每一个独立地建立规则。使用单表继承 (STI) 可以轻松存储这些内容。

所以你可以有:

class Location < ActiveRecord::Base
end

class ForwardLocation < Location
  geocoded_by :address
  after_validation :geocode
end

class ReverseLocation < Location
  reverse_geocoded_by :latitude, :longitude,
    :address => :address
  after_validation :reverse_geocode
end

然后你会相应地添加正确的位置:

self.location = self.address? ? ReverseLocation.create(...) : ForwardLocation.create(...)

您还可以编写比使用这样的子类更直接地处理填充字段的方法,但这完全取决于您接收和处理的数据类型。

通常,一个类应该只有一组之前/之后的回调。:if如果回调定义支持样式声明,它可以有条件地触发其中一些回调。有时您需要编写自己的before_validation例程来处理更奇特的需求。

于 2013-02-11T01:29:15.197 回答