根据ruby地理编码器文档(rubygeocoder.com),可以将地理编码器宝石与Sinatra应用程序一起使用,但是我遇到了让它工作的问题并且无法找到任何工作示例或者相关的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!'
查看堆栈跟踪,看起来它出于某种原因找不到地理编码器包。我不确定它是否是一个我缺少的简单配置,或者如果没有一些宝石定制(我此时无法理解的东西),我正在尝试的东西是不可能的。任何见解,尝试的建议或示例都将非常感激。谢谢!
添加我的config.ru:
require 'bundler/setup'
Bundler.require(:default)
use Bundler.setup(:default) #added this by suggestion
require 'logger'
use Rack::Deflater
Dotenv.load
require "./fl_app"
run FL
答案 0 :(得分:0)
我找到了解决这个问题的方法,但不能解释它为什么会起作用。我不得不添加一行:
reverse_geocoded_by :latitude, :longitude
到我的物品模型。一旦我添加了该行,我就可以使用地理编码器&#39;附近&#39;方法。
即使我实际上没有进行任何地理编码(将lat / long转换为地址,反之亦然),但它似乎仍然需要库正常工作。感谢@iain提供所有有用的建议。