sinatraとmechanizeを一緒に使うと動かない(動かす方法が悪いので)
sinatraで今WEBアプリを作っている。
WEBアクセスがあったらMechanizeで別のサイトへデータを取りに行く、みたいなの。
require 'sinatra' require 'mechanize' get "/" do agent = Mechanize.new agent.open("http://example.com") #とかなんとか end
で、これを起動しようとするとエラーになる
$ bundle exec ruby web_main.rb (省略)/gem/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1497:in `start_server': undefined method `run' for HTTP:Module (NoMethodError) from (省略)/gem/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/base.rb:1435:in `run!' from (省略)/gem/ruby/2.1.0/gems/sinatra-contrib-1.4.2/lib/sinatra/reloader.rb:252:in `run!' from (省略)/gem/ruby/2.1.0/gems/sinatra-1.4.5/lib/sinatra/main.rb:25:in `block in <module:Sinatra>'
メソッド名かなんかが競合しているようだ。
解決方法はStackOverflowに。
ruby - Mechanize & Sinatra conflict - Stack Overflow
まとめると、以下のようにすれば良い。
- 手段その1. WEBハンドラを最上位に書くんじゃなくてクラスでくるんでやる
class MyApp < Sinatra::Base get '/' do # mechanize stuff end end
まだ試してないが、なるほどなと思った。
追記:Thinを入れるだけで手段その2が実現できる。簡単なのでこっちでやることにした。