2013-05-27 6 views
5

機械化をコマンドラインユーティリティとして使用して、単純なWebクローラを作成しました。その後、私はシナトラでWebアプリケーションを作成することを決めたが、ローカルWebサーバを実行しようとすると、このエラーで捕まってしまった:MechanizeとSinatraの競合

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

ソースコードを死んで簡単です:

require 'sinatra' 
require 'mechanize' 

get '/' do 
    # mechanize stuff 
end 

私はしましたいくつかの調査を経て、2つの宝石が別々にうまく動作することを知りましたが、それらを組み合わせるだけで問題が発生しました。問題の原因を誰かが指摘できますか?

+0

の電流値に基づいているあなたは、あなたのコードの多くを投稿することができますか?そして全体のエラーメッセージ?私はソースコードをあなたのものと一致するように設定しましたが、エラーは発生しませんでした。 – fbonetti

+0

私は問題がコードに関連していないと思う。少なくとも「こんにちは世界」のものだけで動かしてみた –

答えて

3

おそらく、あなたは機械化でgetのようなメソッドをオーバーライドしているでしょう。 Sinatraアプリケーションをアプリケーションクラスにラップしてみてください。それによって問題が解決する可能性があります。

require 'sinatra/base' 

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

Sinatra documentationでこのアプローチの詳細を確認してください。

3

私はローカルWebサーバーとしてThinをインストールして使用することで同じ問題を解決できました。

私はシナトラソースに掘って、あなたは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"] 

通常シナトラが戻っWEBrickにまで下落するだろうが、Mechanizeのは、持っていますHTTPという名前のモジュールがサーバーとして使用しようとしますが、これはもちろん動作しません。私は薄い指定するrun.shスクリプトでこれを使用しています

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

iltempoとuser2632580で述べたように、これが失敗した理由は、シナトラがHTTPた上で失敗し、デフォルトでしようとするサーバのリストですMechanizeの宝石はオーバーライドされました。

これを克服する別のアプローチは、http://www.sinatrarb.com/configuration.htmlのドキュメント(「組み込み設定」>「 "server"」を参照)に従ってSinatraに異なるサーバーリストを提供することです。

スクリプト例:

require 'sinatra' 
require 'mechanize' 

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

get '/' do 
    "Hello world!" 
end 

このリストの例では、Sinatra::Base::serverマイナスHTTP

関連する問題