2013-05-27 13 views
5

Mam pisarza zwykłego robota sieciowego używającego Mechanize jako narzędzia wiersza polecenia. Wtedy postanowiłem stworzyć aplikację internetową z Sinatra, ale utknąłem z tym błędem podczas próby uruchomienia lokalnego serwera WWW:Konflikt Mechanize & Sinatra

kod
/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>' 

źródłem jest martwy prosta:

require 'sinatra' 
require 'mechanize' 

get '/' do 
    # mechanize stuff 
end 

mam przeszedł jakieś śledztwo i udało mu się ustalić, że 2 klejnoty działają dobrze osobno, ale tylko ich łączenie powoduje problem. Czy ktoś może wskazać, jaki może być problem?

+0

Możesz pisać więcej kodu? A cały komunikat o błędzie? Ustawiłem kod źródłowy, aby pasował do twojego i nie otrzymywał żadnych błędów. – fbonetti

+0

Myślę, że problem nie jest związany z kodem. przynajmniej próbowałem uruchomić go z tylko "cześć świat" rzeczy –

Odpowiedz

3

Najprawdopodobniej jesteście nadrzędnymi metodami takimi jak mechanizacja. Spróbuj owinąć aplikację Sinatra w klasę aplikacji. To może rozwiązać problem.

require 'sinatra/base' 

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

Dowiedz się więcej o tym podejściu w Sinatra documentation.

3

Miałem ten sam problem i udało mi się go rozwiązać, instalując i używając Thin jako mojego lokalnego serwera WWW.

I wbił Sinatra źródła i widać, że stara się odgadnąć, co serwera do korzystania podczas jazdy, w celu, który można zobaczyć poprzez 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"] 

Normalnie Sinatra by spaść z powrotem do WEBrick ale Mechanize ma Moduł o nazwie HTTP, więc próbuje użyć tego jako serwera, który oczywiście nie działa.

używam tego w skrypcie run.sh określić Cienki:

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

Jak wspomniano przez iltempo i user2632580, powodem tego nie jest lista serwerów Sinatra próbuje domyślnie, w przypadku braku na HTTP, które Klejnot Mechanize został zmieniony.

Alternatywnym sposobem na pokonanie tego problemu jest dostarczenie innej listy serwerów dla Sinatry do wypróbowania zgodnie z dokumentacją pod numerem http://www.sinatrarb.com/configuration.html (patrz "Ustawienia wbudowane"> ": serwer").

Przykład skryptu:

require 'sinatra' 
require 'mechanize' 

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

get '/' do 
    "Hello world!" 
end 

Ta lista w przykładzie jest na podstawie bieżącej wartości Sinatra::Base::server minus HTTP