2014-05-22 2 views
2

루비 지오 코더 문서 (rubygeocoder.com)에 따르면 Sinatra 앱으로 지오 코더 젬을 사용할 수는 있지만 문제가 발생하여 작동하지 못하고 있습니다. 어떤 실제 예제 또는 관련 stackoverflow 문제를 찾을 수 있습니다. 문제는 그것이 Sinatra 앱이며 전체 레일 앱이 아니라는 사실 때문이라고 생각합니다.Sinatra를 사용하여 루비 지오 코더 구현시 문제점

내 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" 

I에 의해 검색 할 (위도와 경도 열이 떠있다) 모델 : 여기

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

Sinatra와 별도로 콘솔이나 스펙에서'Item' 클래스를로드 할 수 있습니까? – iain

+0

Sinatra와 별도로로드하는 방법을 모르겠습니다. 내가 할 수 있어야합니까? 난 레일 애플 리케이션이 아니기 때문에 나는 레일 콘솔을 사용할 수 없다. 그러나 다음과 같이 irb 콘솔에로드 할 수 있습니다. 1. 'sinatra/activerecord'가 필요합니다. 2. './models/item.rb'를로드하십시오. 거기에서 Item.new를 사용하여 새 항목을 인스턴스화 할 수 있습니다. 그 질문에 대한 대답이 확실하지 않습니다. –

답변

0

을 나는이 문제에 대한 해결책을 찾았지만 작동 이유를 설명 할 수 없다. 나는 라인을 추가해야했다 :

reverse_geocoded_by :latitude, :longitude 

내 항목 모델에. 그 라인을 추가하고 나면 지오 코더의 '근접'방법을 사용할 수있었습니다.

주소 지정으로 위도/경도로 변환하는 지오 코딩을 실제로 수행하지는 않지만 라이브러리가 올바르게 작동하는 데 여전히 필요합니다. 모든 유용한 조언을 주셔서 감사합니다.