Опираясь на Ответ AboutRuby , мне нужно было поддерживать выборку статических файлов в lib/public
, а также параметры запросов и куки-файлы (для поддержки аутентифицированных сеансов.) Я также решил поднять исключения для ответов не-200(и обрабатывать их в вызывающих функциях).
Если вы отслеживаете метод self.call
Синатры в sinatra/base.rb
, он принимает параметр env
и создает Rack :: Request сэто, так что вы можете заглянуть туда, чтобы увидеть, какие параметры поддерживаются.
Я не помню все условия операторов возврата (я думаю, что были некоторые изменения в Ruby 2), так что не стесняйтесь настраиваться наВаши требования.
Вот функция, которую я использую:
def get_route url
fn = File.join(File.dirname(__FILE__), 'public'+url)
return File.read(fn) if (File.exist?fn)
base_url, query = url.split('?')
begin
result = self.call('REQUEST_METHOD' => 'GET',
'PATH_INFO' => base_url,
'QUERY_STRING' => query,
'rack.input' => StringIO.new,
'HTTP_COOKIE' => @env['HTTP_COOKIE'] # Pass auth credentials
)
rescue Exception=>e
puts "Exception when fetching self route: #{url}"
raise e
end
raise "Error when fetching self route: #{url}" unless result[0]==200 # status
return File.read(result[2].path) if result[2].is_a? Rack::File
return result[2].join('') rescue result[2].to_json
end