【问题标题】:Post issue with sinatra发布与 sinatra 的问题
【发布时间】:2013-12-18 22:46:16
【问题描述】:

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

【问题讨论】:

  • 定义“搞砸了”。它是你在一条线上反转的秘密的两倍吗?如果是这样,它是 HTML 的东西,与 Sinatra 无关。
  • 对不起,“搞砸了”我的意思是它不会打印出两行。它只打印出底线。如果我添加第三行“helloworld”,它只会在 localhost 页面上显示 helloworld。

标签: ruby sinatra


【解决方案1】:

在您的第一个示例中,您看到的是反向的秘密,因为 Sinatra 从块中获得了反转的字符串并显示它。

在您的第二段代码中,您将反转的字符串打印到本地输出,这是您希望看到显示日志的地方。您看到的是混乱的字符串,因为 p params[:secret].reverse 的结果显然不是 Sinatra 想要正确显示的内容。如果尚未建立其他输出,Sinatra 将回退到尝试显示从路由块返回的值。

本教程的下一部分将介绍视图和模板。这些是您将用于输出网页的内容。

【讨论】:

    【解决方案2】:

    这就是 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
    

    最适合你的。

    【讨论】:

      【解决方案3】:

      哦,我明白了。你正在使用p

      与 PHP 不同,Sinatra 不捕获标准输出。相反,作为页面内容返回的内容是从函数返回的内容。

      在第一个示例中,您返回reverse 的结果。

      在第一个示例中,您返回 nil,这是第二个 p 调用的结果。

      如果你想返回两个反转,你需要构造一个包含它们的字符串:

      post '/secret' do  
        "#{params[:secret].reverse}\n#{params[:secret].reverse}"
      end
      

      【讨论】:

        猜你喜欢
        • 2011-10-15
        • 1970-01-01
        • 2013-06-01
        • 2017-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        相关资源
        最近更新 更多