Sinatra Route什么也没返回



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

require 'sinatra'
 get '/' do
 var='confirmed'
   if var == 'confirmed'
     'Confirmed'
    end
  if var == 'declined'
    'Declined'
   end
 end

现在的问题是:添加"返回"或"下一个"是通常的做法吗? 有了它,它的运行...但是我从来没有在网上找到一个必须使用下一个语句的例子......
那么,"if 逻辑"是否通常在其他地方,并且在路由的末尾只有一个 erb :xyz?我很困惑...

你大部分都有答案。您始终需要向机架发送一些东西才能获得响应。

您可能有一个视图来显示状态,然后在最后添加如下内容(您可以有多个 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的工作方式无关。这更像是Ruby的问题。根据辛纳屈自述文件:

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

最新更新