2016-12-20 9 views
1

私はSinatraを使用しています。プロジェクトを分離したファイル内の特定のアクションのすべての要求を保持するように構造化したいと考えています。インクルードファイルにsinatraリクエストルートを定義します

私が遭遇している問題は、経路がsinatraに登録されていないことです。ルートにファイルを含めても、常に404とnot_foundハンドラを実行します。

ここに私が達成しようとしているものの例があります。 Rackupはユーザーと投稿が必要なInfoアプリを起動します。 Infoにはエラーのみが含まれ、ハンドラは見つかりません。関連するルートは対応する必須ファイルに格納されます。

config.ru:

require 'rubygems' 
require 'bundler' 

Bundler.require 

require 'rack' 
require './info.rb' 
run Info 

info.rb:

require 'rubygems' 
require 'bundler' 

require 'sinatra' 

class Info < Sinatra::Base 
    require './user.rb' 
    require './post.rb' 

    # 500 handler 
    error StandardError do 
     status 500 
     content_type :json 
     return '{"error": "Internal server error", "code": 500}' 
    end 

    not_found do 
     status 404 
     content_type :json 
     return '{"error": "Page not found", "code": 404}' 
    end 
end 

とuser.rb(post.rbが同じになります):

require 'rubygems' 
require 'bundler' 

require 'sinatra' 

get '/1/user/:userid' do 
    # request stuff 
end 

答えて

1

require doesnの」あなたが思っているように働きます。 require './user.rb'に電話すると、class Info < Sinatra::Baseの本文の中に入れても、その内容はそのクラスの中にあるかのように読み込まれません。代わりに、最上位レベルで解析され、ルートはアプリケーションクラスではなくデフォルトのSinatra::Applicationに追加されます。

あなたは同じクラス本体内に定義されたユーザーとポストルートを持っている必要があります。

#info.rb 
require 'sinatra/base' # Require 'sinatra/base' if you are using modular style. 

class Info < Sinatra::Base 
    # It's a bit unusual to have require inside a class, but not 
    # wrong as such, and you might want to have the class defined 
    # before loading the other files. 
    require_relative 'user.rb' # require_relative is probably safer here. 
    require_relative 'post.rb' 

    # ... error handlers etc. 
end 
#user.rb 
require 'sinatra/base' 

# The routes need to be in the same class. 
class Info < Sinatra::Base 
    get '/1/user/:userid' do 
    # request stuff 
    end 
end 
関連する問題