我有一个基于sinatra的rest服务应用程序,我想从一个路由中调用一个资源,有效地从另一个路由中组合一个资源。例如。

get '/someresource' do
  otherresource = get '/otherresource'
  # do something with otherresource, return a new resource
end

get '/otherresource' do
  # etc.
end

重定向将不起作用,因为我需要对第二个资源进行一些处理并从中创建一个新资源。显然,我可以a)使用restclient或其他一些客户端框架,或者b)构造我的代码,使其他资源的所有逻辑都在一个方法中,然后调用它,但是,如果我可以使用它们的dsl从sinatra内部重用我的资源,感觉会干净得多。

最佳答案

我可以通过快速而肮脏的机架请求并直接调用sinatra(一个机架应用程序)应用程序来破解一些东西。虽然不漂亮,但很管用。请注意,最好将生成此资源的代码提取到helper方法中,而不是执行这样的操作。但这是可能的,而且可能有更好、更干净的方式来做这件事。

#!/usr/bin/env ruby
require 'rubygems'
require 'stringio'
require 'sinatra'

get '/someresource' do
  resource = self.call(
    'REQUEST_METHOD' => 'GET',
    'PATH_INFO' => '/otherresource',
    'rack.input' => StringIO.new
  )[2].join('')

  resource.upcase
end

get '/otherresource' do
  "test"
end

如果你想知道更多关于幕后的事情,我已经写了一些关于Rack基础的文章,你可以阅读。有What is Rack?Using Rack

关于ruby - 从Sinatra内调用Sinatra,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3551746/

10-13 21:27