在this tutorial之后为POST创建路线:
post '/secret' do
params[:secret].reverse
end
当我在本地服务器上查看时,我反过来得到了我的秘密消息。但是如果我想在反向行下方打印另一行,则输出会在localhost:9393上全部搞砸。
post '/secret' do
p params[:secret].reverse
p params[:secret].reverse
end
为什么在第二个代码块中,在主页上输入表单中的秘密后,只有一行反向秘密显示在我的输出上?我正在寻找更复杂的代码,但似乎它只打印最后一行。这是Sinatra的事吗?
答案 0 :(得分:2)
在你的第一个例子中,你正在反向看到你的秘密,因为Sinatra从块中传出反向字符串并显示它。
在第二位代码中,您将反向字符串打印到本地输出,这是您希望看到日志显示的位置。你看到一个混乱的字符串,因为p params[:secret].reverse
的结果不是Sinatra显然想要正确显示的结果。如果没有其他输出已经建立,Sinatra将重新尝试显示路径块返回的值。
您接下来的教程的下一部分将介绍视图和模板。这些就是您用来输出网页的内容。
答案 1 :(得分:1)
这就是Sinatra的工作方式。 post
块的返回值作为响应发送。块的返回值始终是块内最后一个语句的返回值。所以你的p
实际上是无用的,它只会打印日志的秘密。恰好p
返回打印后传递的值,因此您仍然会看到一行,因为这是块的返回值。如果您确实想要返回包含该行两次的响应,则必须构建包含两行的单个字符串。有很多方法可以做到这一点,这里有一些:
# use string interpolation to create a string that
# contains reversed_secret, followed by a newline,
# then again followed by reversed_secret
post '/secret' do
reversed_secret = params[:secret].reverse
"#{reversed_secret}\n#{reversed_secret}"
end
# use an array and join the values with a newline
post '/secret' do
reversed_secret = params[:secret].reverse
[reversed_secret, reversed_secret].join("\n")
end
# "print" individual lines to a StringIO object
# and read the resulting string afterwards
post '/secret' do
result = StringIO.new
reversed_secret = params[:secret].reverse
result.puts reversed_secret
result.puts reversed_secret
result.string
end
无论什么最适合你。
答案 2 :(得分:1)
哦,我明白了。您正在使用p
。
与PHP不同,Sinatra不捕获标准输出。而是,作为页面的内容返回的内容是从函数返回的内容。
在第一个示例中,您返回reverse
的结果。
在第一个示例中,您返回nil
,这是第二次p
来电的结果。
如果要返回两个反转,则需要构造一个包含它们的字符串:
post '/secret' do
"#{params[:secret].reverse}\n#{params[:secret].reverse}"
end