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
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. –
Êtes-vous capable de charger la classe 'Item' dans une console ou une spécification séparément de Sinatra? – iain
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. –