Sinatra Route什么都不返回

时间:2018-01-07 01:29:02

标签: ruby routes return sinatra

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

require 'sinatra'

 get '/' do
 var='confirmed'

   if var == 'confirmed'
     'Confirmed'
    end

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

现在的问题是:添加"返回"或" next"通常这样做的方式?有了它,它的运行...但我从来没有在网中找到一个必须使用下一个声明的例子...
那么,是"如果逻辑"通常在其他地方,只有一个erb:xyz在路线的尽头? 我很困惑......

2 个答案:

答案 0 :(得分:2)

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

您可能有一个视图显示状态,然后您在末尾添加类似的内容(您可以为每个路由添加多个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

答案 1 :(得分:0)

这与Sinatra的工作方式无关,真的。这更像是Ruby问题。根据{{​​3}}:

  

路由块的返回值至少确定传递给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