【问题标题】:Sinatra Route returns nothingSinatra Route 不返回任何内容
【发布时间】:2018-06-16 10:38:48
【问题描述】:

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

require 'sinatra'

 get '/' do
 var='confirmed'

   if var == 'confirmed'
     'Confirmed'
    end

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

现在的问题是:添加“return”或“next”是通常的方式吗?有了它,它就可以运行了...但是我从未在网上找到一个必须使用下一条语句的示例...
那么,“if 逻辑”是否通常在其他地方,并且在路线的末尾只有一个 erb :xyz ? 我很困惑……

【问题讨论】:

  • 也许 break 是更好的选择?因为它没有中断方法?

标签: ruby routes return sinatra


【解决方案1】:

大多数情况下你都有答案。您总是需要向机架发送一些东西以获得响应。

您可能有一个显示状态的视图,然后在最后添加类似这样的内容(您可以有多个 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

【讨论】:

    【解决方案2】:

    这与 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
    

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 2019-04-06
      • 2012-02-15
      • 2020-09-07
      • 2021-11-22
      • 2015-11-06
      • 2013-11-14
      • 2014-03-23
      • 2012-08-25
      相关资源
      最近更新 更多