我有一个非常简单的例子,其中sinatra只返回没有输出。 程序输入if子句但块未完成,因此没有任何内容发送到机架,没有任何内容发送到浏览器......不是单个字符。
require 'sinatra'
get '/' do
var='confirmed'
if var == 'confirmed'
'Confirmed'
end
if var == 'declined'
'Declined'
end
end
现在的问题是:添加"返回"或" next"通常这样做的方式?有了它,它的运行...但我从来没有在网中找到一个必须使用下一个声明的例子...
那么,是"如果逻辑"通常在其他地方,只有一个erb:xyz在路线的尽头?
我很困惑......
答案 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