地理编码器导轨,检查是否有效

Sca*_*olo 5 ruby ruby-on-rails rails-geocoder

以下是我使用Geocoder的课程。我无法检查通过地址解析器输入的地址是否有效。当我添加一个公司/编辑一个公司的地址时,此代码非常有用。但是我需要代码才能正常工作,因此,当用户尝试在公司的编辑或创建中放置不提供纬度和经度的地址时,会弹出错误并通知用户该地址无效。

模型

class Company < ActiveRecord::Base
    validates :name, presence: true, length: { maximum: 30 }
    validates :website, presence: true
    validates :address, presence: true
    validates :description, presence: true
    validates :primary_field, presence: true

    geocoded_by :address
    before_save :geocode, if: ->(obj){ obj.address.present? and obj.address_changed? }

    after_save :set_popup_value

    private

     ...

end
Run Code Online (Sandbox Code Playgroud)

视图

<% provide(:title, 'Add Company') %>
<h1>Add Company</h1>
<div class="row">
  <div class="span6 offset3">
    <%= form_for(@company) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :website %>
      <%= f.text_field :website %>

      <%= f.label :primary_field %>
      <%= f.select :primary_field, @primary_field %>

      <%= f.label :address %>
      <%= f.text_field :address, :placeholder => '123 Test St, City State Zip'%>

      <%= f.label :description %>
      <%= f.text_area :description, :size => "30x5" %>

      <%= f.submit "Add Company", class: "btn btn-large btn-primary" %>
    <% end %>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Sca*_*olo 3

因此,经过几天的摸索,我想出了几个解决方案。第一个确实很糟糕,但完成了我所需要的。据我目前所知,我的第二个解决方案更加优雅并且效果很好!我希望其他人觉得这很有用。

我只需几行即可处理控制器中的所有逻辑。

geocoded_by :address
after_validation :geocode, if: ->(obj){ obj.address.present? and obj.address_changed? }
after_validation :lat_changed?

after_save :set_popup_value

private

# This is used to make sure that our address is actually parsed properly and we
# get a valuable lat/long
def lat_changed?
    if (self.address_changed?)
        if !(self.latitude_changed?)
            self.errors.add(:address, "is not valid")
            return false
        end
    end
    return true
end
Run Code Online (Sandbox Code Playgroud)

通过在地理编码之后创建另一个after_validation,我可以检查适当的值是否发生变化,以及它们是否以某种方式发生变化,然后我就知道地理编码中存在问题。

如果地址发生了变化,但纬度没有变化,那么您就知道,当地址通过地理编码器时,它没有得到返回的纬度/经度。如果是这种情况,那么我们只需添加一个错误来抛出给用户并返回 false,这将停止保存到数据库。

我希望其他有此问题的人能够找到这篇文章!