読者です 読者をやめる 読者になる 読者になる

sinatraとmechanizeを一緒に使うと動かない(動かす方法が悪いので)

ruby

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
  • 手段その2. Sinatraアプリを動かすサーバをWebrickからThinにする。(やり方はわからんがなんか設定すればできた気がする)

まだ試してないが、なるほどなと思った。

追記:Thinを入れるだけで手段その2が実現できる。簡単なのでこっちでやることにした。