加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Geocoder rails,检查是否有效

发布时间:2020-12-17 03:06:51 所属栏目:百科 来源:网络整理
导读:以下是我使用地理编码器的课程.我无法检查通过地理编码器发送的地址是否有效.当我添加公司/编辑公司时,此代码非常有用,该公司的地址通过地理编码器提供经度和纬度.但是我需要代码才能工作,所以当用户试图在编辑或创建公司时放置一个不给出纬度和经度的地址时
以下是我使用地理编码器的课程.我无法检查通过地理编码器发送的地址是否有效.当我添加公司/编辑公司时,此代码非常有用,该公司的地址通过地理编码器提供经度和纬度.但是我需要代码才能工作,所以当用户试图在编辑或创建公司时放置一个不给出纬度和经度的地址时,会弹出一个错误并通知用户该地址无效.

模型

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

视图

<% 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>

解决方法

所以,几天来我已经能够修补这个问题,我想出了几个解决方案.第一个真的很hacky,但完成了我需要的.我的第二个解决方案更加优雅,并且从我迄今为止所能说的方面来说效果很好!我希望其他人觉得这很有用.

我只用几行处理控制器中的所有逻辑.

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

通过在我的地理编码之后创建另一个after_validation,我能够检查相应的值是否已更改,以及它们是否以某种方式更改,而不是我知道地理编码中存在问题.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读