与sinatra发布问题

时间:2013-12-18 22:46:16

标签: ruby sinatra

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的事吗?

3 个答案:

答案 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