我有一个基于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中的资源,感觉会干净得多。
发布于 2010-08-24 06:05:33
我可以通过发出一个又快又脏的rack请求并直接调用Sinatra (一个rack应用程序)来破解一些东西。它不是很漂亮,但它是有效的。请注意,将生成此资源的代码提取到帮助器方法中可能比这样做更好。但这是可能的,而且可能有比这更好、更干净的方法。
#!/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。
发布于 2012-08-30 18:52:16
另一种选择(我知道这没有回答你的实际问题)是将你的公共代码(甚至模板渲染)放在一个助手方法中,例如:
helpers do
def common_code( layout = true )
@title = 'common'
erb :common, :layout => layout
end
end
get '/foo' do
@subtitle = 'foo'
common_code
end
get '/bar' do
@subtitle = 'bar'
common_code
end
get '/baz' do
@subtitle = 'baz'
@common_snippet = common_code( false )
erb :large_page_with_common_snippet_injected
end发布于 2014-07-05 04:24:44
Sinatra的文档涵盖了这一点--本质上是使用底层rack接口的call方法:
http://www.sinatrarb.com/intro.html#Triggering%20Another%20Route
触发另一个路由
有时
pass并不是您想要的,相反,您希望获得调用另一条路由的结果。只需使用call即可实现此目的:
get '/foo' do
status, headers, body = call env.merge("PATH_INFO" => '/bar')
[status, headers, body.map(&:upcase)]
end
get '/bar' do
"bar"
endhttps://stackoverflow.com/questions/3551746
复制相似问题