2014-05-22 4 views
2

Selon la documentation de ruby ​​geocoder (rubygeocoder.com), il est possible d'utiliser la gemme geocoder avec une application Sinatra, mais je rencontre des problèmes pour la faire fonctionner et je n'ai pas pu pour trouver des exemples de travail ou des problèmes liés stackoverflow soit. Je pense que le problème est dû au fait qu'il s'agit d'une application Sinatra et non d'une application complète.Problèmes d'implémentation de ruby ​​geocoder avec Sinatra

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

Le modèle (qui a colonnes float de latitude et de longitude) que je veux rechercher par:

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 
} 

Voici le code app.rb avec le '/' itinéraire:

class FL < Sinatra::Base 
    get '/' do 
    @items = Item.near('Detroit, MI, US') 
    puts "ITEMS ARE:" 
    pp @items 
    erb :index 
    end 
    ... 
end 

Voici le contenu de app.rb pertinents:

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 

Enfin, voici l'erreur que je reçois:

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!' 

En regardant le stacktrace, il semble que ce ne est pas à trouver le paquet de géocodage pour une raison quelconque. Je ne suis pas sûr si c'est une configuration simple qui me manque, ou si ce que j'essaye n'est pas possible sans une personnalisation de gemme (quelque chose au delà de ma compréhension à ce point). Toute idée, suggestion à essayer ou exemple serait très appréciée. Merci!

Ajout mon 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

En fait, j'ai été en mesure de confirmer que son géocodage de chargement correct, parce que la ligne suivante est en mesure d'exécuter et produire une sortie: @location = géocodage :: Calculations.extract_coordinates ([42,44, -83,33]), c'est juste ne pas charger (ou pour une autre raison n'est pas en mesure d'accéder) les méthodes liées aux modèles. –

+0

Êtes-vous capable de charger la classe 'Item' dans une console ou une spécification séparément de Sinatra? – iain

+0

Je ne suis pas sûr de savoir comment le charger séparément de Sinatra. Devrais-je pouvoir? Je ne suis pas en mesure d'utiliser la console rails, car ce n'est pas une application rails. Je peux cependant le charger dans la console irb, avec ce qui suit: 1. require 'sinatra/activerecord' 2. load './models/item.rb'. De là, je peux instancier de nouveaux éléments avec Item.new. Je ne suis pas sûr si cela répond à votre question. –

Répondre

0

J'ai trouvé une solution à ce problème, mais ne peut pas expliquer pourquoi cela fonctionne. Je devais ajouter la ligne:

reverse_geocoded_by :latitude, :longitude 

à mon modèle d'article. Une fois que j'ai ajouté cette ligne, j'ai pu utiliser la méthode 'near' de geocoder.

Même si je ne fais pas de géocodage (conversion lat/long en adresses, ou vice versa), il semble toujours nécessaire que la bibliothèque fonctionne correctement. Merci @iain pour tous vos conseils utiles.