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

时间:2014-05-22 01:21:10

标签: sinatra rails-geocoder

根据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:

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

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法,但不能解释它为什么会起作用。我不得不添加一行:

  reverse_geocoded_by :latitude, :longitude

到我的物品模型。一旦我添加了该行,我就可以使用地理编码器&#39;附近&#39;方法。

即使我实际上没有进行任何地理编码(将lat / long转换为地址,反之亦然),但它似乎仍然需要库正常工作。感谢@iain提供所有有用的建议。