2013-03-23 80 views
2

我正在嘗試爲我的Rack應用創建子域路由器,但遇到了問題。這裏是我的config.ru代碼:未定義的哈希方法`to_i'

require './controllers/subdomain' 
require './controllers/www' 

set :root, './' 

run Example::Subdomain.new({ 
           :www => Sinatra::Application 
          }) 

這裏是我subdomain.rb代碼:

module Example 
    class Subdomain 
    def initialize(map = {}) 
     @map = map 
    end 

    def call(env) 
     @map.each do |subdomain, app| 
     if env['HTTP_HOST'].split('.').first.eql?(subdomain) 
      app.call(env) 
     end 
     end 
    end 
    end 
end 

當我運行此我得到以下錯誤:

NoMethodError: undefined method `to_i' for {:www=>Sinatra::Application}:Hash 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/lint.rb:555:in `check_status' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/lint.rb:19:in `call' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/lint.rb:19:in `assert' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/lint.rb:555:in `check_status' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/lint.rb:51:in `_call' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/lint.rb:37:in `call' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/showexceptions.rb:24:in `call' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in `call_without_check' 
    /Library/Ruby/Gems/1.8/gems/sinatra-1.3.6/lib/sinatra/base.rb:161:in `call' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/chunked.rb:43:in `call' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/content_length.rb:14:in `call' 
    /Library/Ruby/Gems/1.8/gems/thin-1.5.0/lib/thin/connection.rb:81:in `pre_process' 
    /Library/Ruby/Gems/1.8/gems/thin-1.5.0/lib/thin/connection.rb:79:in `catch' 
    /Library/Ruby/Gems/1.8/gems/thin-1.5.0/lib/thin/connection.rb:79:in `pre_process' 
    /Library/Ruby/Gems/1.8/gems/thin-1.5.0/lib/thin/connection.rb:54:in `process' 
    /Library/Ruby/Gems/1.8/gems/thin-1.5.0/lib/thin/connection.rb:39:in `receive_data' 
    /Library/Ruby/Gems/1.8/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run_machine' 
    /Library/Ruby/Gems/1.8/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run' 
    /Library/Ruby/Gems/1.8/gems/thin-1.5.0/lib/thin/backends/base.rb:63:in `start' 
    /Library/Ruby/Gems/1.8/gems/thin-1.5.0/lib/thin/server.rb:159:in `start' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/handler/thin.rb:16:in `run' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/server.rb:264:in `start' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/lib/rack/server.rb:141:in `start' 
    /Library/Ruby/Gems/1.8/gems/rack-1.5.2/bin/rackup:4 
    /usr/bin/rackup:19:in `load' 
    /usr/bin/rackup:19 
    -e:1:in `load' 
    -e:1 

有誰有任何想法,爲什麼這是發生而不是運行app.call(env)

這是錯誤的截圖: http://i46.tinypic.com/3538is6.jpg

而且此代碼的​​工作,但它並不由子域規則遵守壽:

module Example 
    class Subdomain 
    def initialize(map = {}) 
     @map = map 
    end 

    def call(env) 
     @map.each do |subdomain, app| 
     return app.call(env) 
     end 
    end 
    end 
end 
+0

我也測試了從http://stackoverflow.com/questions/15325002/modify-rack-app的子域代碼,我仍然得到s艾姆錯誤,所以我不認爲它的代碼它必須是與機架狀態代碼的東西,但我不能找出問題發生的地方 – ny95 2013-03-23 20:20:11

回答

0

我結束了下面的代碼解決這個:

module Example 
    class Subdomain 
    def initialize(map = {}) 
     @map = map 
    end 

    def call(env) 
     @map.each { |subdomain, app| return app.call(env) if env['HTTP_HOST'].split('.').first.eql?(subdomain) } 
    end 
    end 
end 

run Example::Subdomain.new({ 
     'www' => Sinatra::Application, 
     'api' => Example::API 
    }) 

我改變了哈希值包裹串並添加了一個returnapp.call(env)

2

機架認爲你是返回@map爲響應三元組中的狀態碼是[status, headers, body](如圖所示here)。這是因爲each在迭代結束時返回集合,並將其用作call的返回值。

也許這會爲你工作,或者至少讓你開始:

def call(env) 
    subdomain = env['HTTP_HOST'].split('.').first 
    app = @map[subdomain] 
    app.call(env) 
end