我有一个非常简单的例子,其中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