ruby-on-rails - 使用地理编码器 gem 进行验证

标签 ruby-on-rails rails-geocoder

我正在尝试找出在何处向使用地理编码器的 Rails 4 应用程序添加验证错误。

我的模型是这样的:

class Tutor < ActiveRecord::Base
  belongs_to :user      
  validates_presence_of :user_id

  geocoded_by :address do |obj, results|
    if geo = results.first
      obj.latitude = geo.latitude
      obj.longitude = geo.longitude
      obj.country = geo.country
      obj.city = geo.city
      obj.postalcode = geo.postal_code
      obj.address = geo.address
    end
  end
  after_validation :geocode, if: :address_changed?

end

我注意到 if geo = result.first 条件只有在成功找到地址时才会执行。如果返回 nil,我想添加一条错误消息。我看到了 this stackoverflow thread解释说我应该使用 before_validation 而不是 after_validation,但我仍然不明白在哪里添加错误,以便我的 View 可以重新呈现并且有效的地理位置可以被输入。

我应该把这些信息放在哪里? 谢谢!

最佳答案

您可以像下面这个例子一样在模型中设置以验证地址,本地址更改时,地理编码将只调用一次。在 geocoded_by 方法中,我们明确设置写入纬度和经度,以便在找不到地址时将这些列设置为 nil。

class Company < ActiveRecord::Base
   geocoded_by :address do |object, results|
    if results.present?
     object.latitude = results.first.latitude
     object.longitude = results.first.longitude
    else
     object.latitude = nil
     object.longitude = nil
    end
  end

  before_validation :geocode, if: :address_changed?

  validates :address, presence: true
  validates :found_address_presence

  def found_address_presence
    if latitude.blank? || longitude.blank?
      errors.add(:address, "We couldn't find the address")
    end
  end
end

关于ruby-on-rails - 使用地理编码器 gem 进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19224733/

相关文章:

ruby-on-rails - 使用 Carrierwave 以嵌套形式上传多个图像

ruby-on-rails - 开发环境中地理编码器的假 IP

sql - Rails Postgres : set all fields in a table to zero, 除了

ruby-on-rails - ruby 装饰器和类 eval 之间有什么区别?

ruby-on-rails - Geocoder:.nearbys 方法抛出 ActionView::Template::Error (nil:NilClass 的未定义方法 `each'):

ruby-on-rails - 使用 geocoder gem for rails,我如何获得访客的城市?

ruby-on-rails - Geocoder Gem 反向地理编码

ruby-on-rails - 未定义的方法 `merge' 为 "xxxxxx":String rails form_for

ruby-on-rails - heroku 数据库访问和修改太昂贵/太耗时?如何让它更快?

ruby-on-rails - 建立所需的连接