2013-05-27 19 views
5

Ho scritto un semplice web crawler utilizzando Mechanize come utilità della riga di comando. Poi ho deciso di creare applicazioni Web con Sinatra, ma sono bloccato con questo errore quando si tenta di eseguire il server web locale:Conflitto Mechanize & Sinatra

codice
/home/nazar/.rvm/gems/ruby-2.0.0-p195/gems/sinatra-1.4.2/lib/sinatra/base.rb:1569:in `run!': undefined method `run' for HTTP:Module (NoMethodError) 
from /home/nazar/.rvm/gems/ruby-2.0.0-p195/gems/sinatra-1.4.2/lib/sinatra/main.rb:25:in `block in <module:Sinatra>' 

La fonte è morto semplice:

require 'sinatra' 
require 'mechanize' 

get '/' do 
    # mechanize stuff 
end 

ho passò attraverso alcune indagini e riuscì a scoprire che 2 gemme funzionano bene separatamente, ma solo combinarle causa il problema. Qualcuno può indicare quale potrebbe essere il problema?

+0

Puoi pubblicare più del vostro codice? E l'intero messaggio di errore? Ho impostato il codice sorgente in modo che corrisponda al tuo e non abbia ricevuto errori. – fbonetti

+0

Penso che il problema non sia legato al codice. almeno ho provato a farlo funzionare con solo "ciao mondo" roba –

risposta

3

Molto probabilmente si sono metodi prevalenti come ottenere con meccanizza. Prova ad avvolgere la tua applicazione Sinatra in una classe di applicazione. Questo potrebbe risolvere il problema.

require 'sinatra/base' 

class MyApp < Sinatra::Base 
    get '/' do 
    # mechanize stuff 
    end 
end 

Saperne di più su questo approccio nel Sinatra documentation.

3

Ho avuto lo stesso problema ed è stato in grado di risolverlo installando e utilizzando Thin come server Web locale.

ho scavato nel fonte Sinatra e vedere che si cerca di indovinare che cosa server da utilizzare durante l'esecuzione, al fine, che è possibile vedere via IRB:

1.9.3p194 :011 > require 'sinatra' 
=> true 
1.9.3p194 :012 > Sinatra::Base 
=> Sinatra::Base 
1.9.3p194 :014 > Sinatra::Base::server 
=> ["thin", "puma", "HTTP", "webrick"] 

Normalmente Sinatra sarebbe ricadere WEBrick ma Mechanize ha un modulo chiamato HTTP, quindi tenta di usarlo come server, che ovviamente non funziona.

Sto usando questo in uno script run.sh per specificare Thin:

rerun -- thin start --port=4567 -R config.ru 
0

Come menzionato da iltempo e user2632580, la ragione per cui questo non è l'elenco dei server Sinatra cerca per default, in mancanza su HTTP che la gemma Mechanize è stata sostituita.

Un approccio alternativo per superare questo è fornire un elenco diverso di server per Sinatra da provare come da documentazione a http://www.sinatrarb.com/configuration.html (consultare "Impostazioni predefinite"> ": server").

Esempio di script:

require 'sinatra' 
require 'mechanize' 

set :server, %w[thin puma reel webrick] 

get '/' do 
    "Hello world!" 
end 

Questo elenco nell'esempio si basa sul valore corrente di Sinatra::Base::server meno HTTP