使用Sinatra实现ruby地理编码器的问题



根据rubygeocoder文档(rubygeocoder.com),可以使用Sinatra应用程序的geocoder gem,但我遇到了让它工作的问题,并且无法找到任何工作示例或相关的stackoverflow问题。我认为这个问题是由于它是一个Sinatra应用程序,而不是一个完整的rails应用程序。

我Gemfile

:

source "https://rubygems.org"
ruby '2.1.2'
gem 'dotenv', '~> 0.10.0'
gem 'pg', '~> 0.17.1'
gem 'rack-flash3'
gem "sinatra"
gem "activerecord"
gem "sinatra-activerecord"
gem "geocoder"
gem 'omniauth'
gem 'omniauth-google-oauth2'
gem "sqlite3"
gem "shotgun"

我要搜索的模型(具有浮动纬度和经度列):

class Item < ActiveRecord::Base  
 extend Geocoder::Model::ActiveRecord
  attr_accessor :latitude, :longitude
  belongs_to :profile
  has_and_belongs_to_many :categories
  has_many :reports, dependent: :destroy
}
下面是带有'/'路由的app.rb代码:
class FL < Sinatra::Base
  get '/' do
    @items = Item.near('Detroit, MI, US')
    puts "ITEMS ARE:"
    pp @items
    erb :index
  end
  ...
end

以下是app.rb的相关内容:

require 'rubygems'
require 'sinatra/base'
require 'sinatra/flash'
require 'sinatra/activerecord'
require 'geocoder'
require 'omniauth'
require 'sinatra/flash'
require 'json'
require 'pp'
require 'rack-flash'
require './models/model_init'
require './helpers/helper'
require './auth'
require './admin'
require './api'
class FL < Sinatra::Base
  set :root, File.dirname(__FILE__)
  enable :logging
  enable :sessions
  #set :logging, true
  register Sinatra::ActiveRecordExtension
  register Sinatra::Flash
  set :show_exceptions, true if ENV['RACK_ENV'] == 'development'
  use Rack::Session::Cookie, :secret => ENV['RACK_COOKIE_SECRET']
end

最后,这里是我收到的错误:

NoMethodError - undefined method `near' for #<Class:0x0000010750d0b8>:
/Users/bob/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.0/lib/active_record/dynamic_matchers.rb:26:in `method_missing'
/Users/bob/rails_projects/fl2/api.rb:21:in `block in <class:FL>'
/Users/bob/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `call'
/Users/bob/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `block in compile!'
/Users/bob/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `[]'
/Users/bob/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (3 levels) in route!'

查看堆栈跟踪,由于某种原因,它看起来没有找到geocoder包。我不确定是否这是一个简单的配置,我错过了,或者如果我没有一些宝石定制是不可能的(在这一点上超出了我的理解)。任何见解,建议尝试,或例子将不胜感激。谢谢!

添加config.ru: <标题> config.ru h1> div class="one_answers">

我找到了这个问题的解决方案,但无法解释为什么它有效。我必须添加一行:

  reverse_geocoded_by :latitude, :longitude

到我的Item模型。一旦我添加了那行,我就可以使用geocoder的"near"方法了。

即使我实际上没有做任何地理编码(转换lat/long到地址,反之亦然),它似乎仍然是必要的库正确工作。谢谢@iain给我的建议。

最新更新