在包含的文件中定义sinatra请求路由

时间:2016-12-20 02:18:37

标签: ruby sinatra

我正在使用Sinatra,我希望我的项目的构建方式能够将所有特定操作请求保存在单独的文件中。

我遇到的问题是路由没有在sinatra中注册,它总是404s并运行我的not_found处理程序,即使我已经包含了一个带路径的文件。

这是我想要实现的一个例子; Rackup将启动需要用户和帖子的信息应用程序。 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 个答案:

答案 0 :(得分:1)

require不会像你认为的那样工作。当您调用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