2014-05-22 52 views
2

據紅寶石地理編碼器文件(rubygeocoder.com),它可以使用地理編碼寶石與西納特拉應用紅寶石地理編碼器,但我遇到了問題,得到它的工作並沒有能夠找到任何工作示例或相關的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 
+0

實際上,我已經能夠確認它的加載地理編碼器正常,因爲下面的行能夠運行併產生輸出: @location = Geocoder :: Calculations.extract_coordinates([42.44,-83.33]),它只是沒有加載(或因其他原因無法訪問)與模型相關的方法。 –

+0

您能夠加載'Item'類在控制檯或西納特拉單獨的規格? – iain

+0

我不知道如何從西納特拉單獨加載它。我應該能夠嗎?我無法使用導軌控制檯,因爲它不是導軌應用程序。我可以在IRB控制檯加載然而,具有以下步驟:1.需要「西納特拉/ ActiveRecord的」 2.負載「./models/item.rb」。從那裏我可以用Item.new實例化新項目。我不確定這是否回答你的問題。 –

回答

0

我找到了解決這個問題,但不能解釋爲什麼它的工作原理。我必須添加行:

reverse_geocoded_by :latitude, :longitude 

我的項目模型。一旦我添加了該行,我就可以使用geocoder的「near」方法。

即使我沒有真正做任何地理編碼(轉換緯度/長地址,反之亦然),它似乎仍然是必要的庫才能正常工作。感謝@iain提供所有有用的建議。