首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Sinatra内部调用Sinatra

从Sinatra内部调用Sinatra
EN

Stack Overflow用户
提问于 2010-08-24 05:13:00
回答 5查看 6K关注 0票数 17

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

代码语言:javascript
复制
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中的资源,感觉会干净得多。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-24 06:05:33

我可以通过发出一个又快又脏的rack请求并直接调用Sinatra (一个rack应用程序)来破解一些东西。它不是很漂亮,但它是有效的。请注意,将生成此资源的代码提取到帮助器方法中可能比这样做更好。但这是可能的,而且可能有比这更好、更干净的方法。

代码语言:javascript
复制
#!/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

票数 9
EN

Stack Overflow用户

发布于 2012-08-30 18:52:16

另一种选择(我知道这没有回答你的实际问题)是将你的公共代码(甚至模板渲染)放在一个助手方法中,例如:

代码语言:javascript
复制
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
票数 13
EN

Stack Overflow用户

发布于 2014-07-05 04:24:44

Sinatra的文档涵盖了这一点--本质上是使用底层rack接口的call方法:

http://www.sinatrarb.com/intro.html#Triggering%20Another%20Route

触发另一个路由

有时

pass并不是您想要的,相反,您希望获得调用另一条路由的结果。只需使用call即可实现此目的:

代码语言:javascript
复制
get '/foo' do
  status, headers, body = call env.merge("PATH_INFO" => '/bar')
  [status, headers, body.map(&:upcase)]
end

get '/bar' do
  "bar"
end
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3551746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档