[#48450] 1.8.7と1.9.2の挙動の違いについて — "Jun'ya Shimoda" <jun-shimo@...>

下田です。

13 messages 2011/10/09

[ruby-list:48503] GAEにてundefined method ssl?のエラー原因について

From: やじゅ <yasuhito.hiraguchi@...>
Date: 2011-10-29 01:20:08 UTC
List: ruby-list #48503
はじめまして、八寿(やじゅ)と申します。

今更ですが、GAE上でSinatraを動かしたいと思い挑戦しておりますが
下記のエラーが発生してしまいます。MacとWindowsのどちらでも発生している現象です。(CRuby1.8.7、JRuby1.6.4を使用)
org.jruby.rack.RackInitializationException: undefined method `ssl?'
for class `Sinatra::Request'

Rack::Request(rack 1.3.4)には、ssl?は下記のように定義されております。
def ssl?
    scheme == 'https'
end

なお、この質問10/20にGoogleグループの「Google App Engine for JRuby 」にしておりますが未だ回答は頂けておりません。

実はRubyはここ最近始めたばかりで、細かい仕様については把握出来てない部分がありますのでご了承ください。

自分なりに調べたかぎりでは、Sinatraを使わなくてもこの現象が起きるようです。
検証用に下記のソース作成しました、Rack::Requestを継承したRequest2の「alias sequre? ssl?」のところで
undefined method `ssl?'が発生します。
ところが、Fooを継承したBarの「alias sequre? ssl?」ではエラーとはなりません。
この違いに何か解決方法が隠れているのかと思っております。
今はコメントしてありますが、「alias sequre? ssl?」を「def sequre? ssl? end」にするとエラーが出なくなり正常に動作します。

原因が分かる方がおられれば、ご教授お願いします。

require 'rack/request'
require 'rack/response'

SIMPLE_CONTENT = <<__EOS__
<html>
<body>
<form method="POST" action="/">
  <input type="text" name="n" />
  <input type="submit" />
</form>
</body>
</html>
__EOS__

class Foo
    @@a = 2

    def ssl?
        @@a == 1
    end
end

class Bar < Foo
    alias sequre? ssl?

#   def sequre?
#       ssl?
#   end
end

class Request2 < Rack::Request
    alias secure? ssl?
end

class Simple
  def call(env)
    req = Request2.new(env)
    res = Rack::Response.new{|r|
      case
      when req.get?
        r.write SIMPLE_CONTENT
      when req.post?
        r.write "Hello, #{req['n']}!!"
        #bar = Bar.new
        #r.write "<br>Result=" + bar.sequre?.to_s
      end
    }
    res.finish
  end
end

run Simple.new

In This Thread

Prev Next