我有一个基于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/