2013-12-17 18 views
8

Questo è l'errore che ottengo quando faccio funzionare qualsiasi rake comando: undefined method 'desc' for Sinatra::Application:Classmetodo non definito `disc' per Sinatra :: Application: Classe

# app.rb 
require 'sinatra' 
require 'sinatra/activerecord' 
require 'sinatra/contrib' 

get '/' do 
    puts "Hello World" 
end 

# config.ru 
require "./app" 
run Sinatra::Application 

# Rakefile 
require './app' 
require 'sinatra/activerecord/rake' 

# Gemfile 
source 'https://rubygems.org' 
ruby '2.0.0' 

gem 'activerecord', '~> 4.0.2' 
gem 'sinatra', '~> 1.4.4' 
gem 'sinatra-activerecord', '~> 1.2.3' 
gem 'sinatra-contrib', '~> 1.4.2' 

traccia completa:

/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:269:in `method_missing' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-activerecord-1.2.3/lib/sinatra/activerecord/tasks.rake:4:in `block in <top (required)>' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:126:in `class_eval' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:126:in `block in new' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `initialize' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `new' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `new' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:142:in `namespace' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-1.4.4/lib/sinatra/base.rb:1972:in `block (2 levels) in delegate' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-activerecord-1.2.3/lib/sinatra/activerecord/tasks.rake:3:in `<top (required)>' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:223:in `load' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:223:in `block in load' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:214:in `load_dependency' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:223:in `load' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-activerecord-1.2.3/lib/sinatra/activerecord/rake.rb:77:in `<top (required)>' 
/Users/j/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require' 
/Users/j/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/backports-3.3.5/lib/backports/tools.rb:328:in `require_with_backports' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:229:in `block in require' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:214:in `load_dependency' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:229:in `require' 
/Users/j/Desktop/app/Rakefile:2:in `<top (required)>' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/rake_module.rb:25:in `load' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/rake_module.rb:25:in `load_rakefile' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/application.rb:637:in `raw_load_rakefile' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/application.rb:94:in `block in load_rakefile' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/application.rb:93:in `load_rakefile' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/application.rb:77:in `block in run' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/lib/rake/application.rb:75:in `run' 
/Users/j/.rvm/gems/[email protected]/gems/rake-10.1.0/bin/rake:33:in `<top (required)>' 
/Users/j/.rvm/gems/[email protected]/bin/rake:23:in `load' 
/Users/j/.rvm/gems/[email protected]/bin/rake:23:in `<main>' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/bin/ruby_executable_hooks:15:in `eval' 
/Users/j/.rvm/gems/ruby-2.0.0-p247/bin/ruby_executable_hooks:15:in `<main>' 
+0

Da dove viene il backtrace punto? –

+0

Aggiunto backtrace e Gemfile. – jamesfzhang

+1

e cosa c'è in ./app? – phoet

risposta

10

Il Sinatra namespace extension da Sinatra contrib sta interferendo con il supporto dello spazio dei nomi di Rake. Entrambi definiscono un metodo namespace e la versione contrib di Sinatra viene chiamata (erroneamente) dallo Sinatra-ActiveRecord Rake tasks.

Se non si utilizzano gli spazi dei nomi di Sinatra-contrib, la soluzione più semplice sarebbe only require those extensions that you need; per esempio. cambiare

require 'sinatra/contrib' 

a

require 'sinatra/whatever' 
require 'sinatra/anotherextension' 

Se si sta utilizzando namespace Sinatra, allora penso che si può essere in grado di aggirare questo spostando ad un modular style app. Cambia la tua app.rb a qualcosa di simile

require 'sinatra/base' # note this has changed from just 'sinatra' 
require 'sinatra/activerecord' 
require 'sinatra/contrib' 

class MyApp < Sinatra::Base 
    register Sinatra::Contrib 

    get '/' do 
    "Hello World" 
    end 

    # other routes etc. as needed 
end 

Poi, nel tuo config.ru è necessario run MyApp piuttosto allora run Sinatra::Application (naturalmente si può - e si deve - dare la vostra classe un nome migliore). Ciò evita la collisione dei due metodi namespace, poiché la versione di Sinatra è disponibile solo nella classe dell'applicazione, non nel livello principale.

+0

Stavo eseguendo un'applicazione modulare, ma ho dimenticato il requisito specifico 'sinatra/base'. Grazie, mi ha salvato! – aledalgrande

14

trovato una soluzione più semplice:

Juste aggiungere la richiedono: true attributo per contrib Sinatra nel Gemfile:

gem "sinatra-contrib",require: false 

Abbiamo trovato questo qui:

http://aaronlerch.github.io/blog/sinatra-bundler-and-the-global-namespace/

+2

Sto usando Sinatra per simulare un'API esterna per i test in un'app Rails e ho avuto lo stesso problema con 'sinatra' e' sinatra-contrib' richiesto globalmente, per impostazione predefinita, dal mio Gemfile. Questo lo aggiusta! Grazie :) – mltsy

Problemi correlati