Sinatra Route什么都不返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sinatra Route什么都不返回相关的知识,希望对你有一定的参考价值。

我有一个非常简单的例子,其中sinatra只返回没有输出。程序输入if子句但块未完成,因此没有任何内容发送到机架,没有任何内容发送到浏览器......不是单个字符。

require 'sinatra'

 get '/' do
 var='confirmed'

   if var == 'confirmed'
     'Confirmed'
    end

  if var == 'declined'
    'Declined'
   end
 end

现在的问题是:通常会采用“返回”还是“下一步”的方式?随着它,它的运行...但我从来没有在网络中找到一个必须使用下一个声明的例子...... 那么,“if logic”通常是在其他地方,并且在路径的末尾只有一个erb:xyz吗?我很迷惑...

答案

这与Sinatra的工作方式无关,真的。这更像是Ruby问题。据Sinatra readme说:

路由块的返回值至少确定传递给HTTP客户端的响应主体,或至少确定Rack堆栈中的下一个中间件。最常见的是,这是一个字符串,如上例所示。但其他价值观也被接受。

您的代码中的问题是您的上一个if本身就是一个声明。如果你的var变量不是"declined",那么if块的计算结果为nil,因为它是你的路径块中的最后一个值,这就是Sinatra返回的值。

当你使用显式return时,你没有到达第二个if并且没有这个问题,这就是为什么它适用于显式返回。


您不需要像这样使用if/elsif块进行显式返回:

  # This is one single statement that would return either confirmed or declined
  # Request will always return a non-nil value
  get '/' do
    ...
    if var == 'confirmed'
      'Confirmed'
    elsif var == 'declined'
      'Declined'
    end
  end

或者case/when块:

  # This is one single statement that would return either confirmed or declined
  # Request will always return a non-nil value  
  get '/' do
    ...
    case var
    when 'confirmed' then 'Confirmed'
    when 'declined' then 'Declined'
    end
  end
另一答案

你有答案。您总是需要将一些东西发送到机架以获得响应。

你可能有一个视图显示状态,然后你在最后添加这样的东西(你可以有多个erb块只为每个路由添加一个erb调用):

get '/' do
  var='confirmed'

  if var == 'confirmed'
      st = 'Confirmed'
  end

  if var == 'declined'
      st = 'Declined'
  end

  erb :myViewName, :locals => {:status => st}
end    

或者只是像这样使用return,如果您的响应只是一个字符串。请注意,此return之后的所有内容都未执行:

if var == 'confirmed'
    return 'Confirmed'
end

以上是关于Sinatra Route什么都不返回的主要内容,如果未能解决你的问题,请参考以下文章

使用RSpec测试Sinatra API端点

Mongoose - 保存功能啥都不做

为啥此代码片段返回意外结果?

使用 ruby​​、Sinatra 和 Mandrill 如何从 api 调用访问单个元素并打印为 HTML?

Sinatra 应用程序作为机架中间件 TimeOut Rails 3

Sinatra 应用程序中的“Rake 无法加载此类文件”错误