根据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给我的建议。
标题>