ruby-on-rails - 如何从表单编码字符串中获得 pretty-print 效果

标签 ruby-on-rails awesomeprint

各位好。 如何强制 request.body(或任何其他非 JSON 字符串)以漂亮的多行 JSON 或 yaml 样式打印出来?

我见过将此类字符串转换为真正的 JSON 的奇特方法,但希望避免使用另一种方法。

  def request_token_from_google
    uri = URI.parse('https://www.googleapis.com/oauth2/v3/token')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    request = Net::HTTP::Post.new(uri.request_uri)
    request.set_form_data(self.to_params)
    puts "request body is"
    puts request.body.to_yaml # doesn't work
    puts request.body.to_json # doesn't work
    http.request(request)
  end

最佳答案

问题在于:

ap "request body is #{request.body.to_json}"

...你的其他尝试是你试图漂亮地打印已经是字符串的东西。 Awesome_print(和inspect及其同类)的目的是获取一个具有某种结构的对象并打印它,以便您可以看到它的结构,但是字符串没有结构 - 它只是字符,字符, 特点。当你给awesome_print一个像"request body is {"foo":...这样的字符串时,它无法知道"is"后面的部分有什么特殊之处。

如果您有一个具有结构的对象,解决方案是将其直接提供给awesome_print:

puts "request body is:"
ap my_hash_or_array

不幸的是,在这种情况下它不会有帮助,因为 request.body 也只是一个字符串 - 它是表单编码的数据,如下所示(从 Wikipedia 窃取):

Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21

就像“请求正文是...”示例一样,awesome_print无法知道这有什么特别的。您可以做的一件非常简单的事情就是在每个键/值对之间添加换行符:

body = "Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21"

puts "Request body is:"
puts body.gsub("&", "\n  &")
# => Request body is:
#    Name=Jonathan+Doe
#      &Age=23
#      &Formula=a+%2B+b+%3D%3D+13%25%21

这有一个缺点,即值仍然是百分比编码的,正如您在公式的情况中所看到的那样。如果这是一个问题,您可以使用 CGI.parseRack::Utils.parse_query 来解析表单数据,这两种方法都可以在 Rails 中使用。它们都返回一个可以提供给 Awesome_print 的哈希值,但格式略有不同(CGI 将所有值作为数组返回,Rack::Utils 仅在它们采用“数组”格式时才返回,例如 foo[]=1&foo[ ]=2)。这是 Rack::Utils(您只需想象输出是彩色的):

puts "Request body is:"
ap Rack::Utils.parse_query(body)
# => Request body is:"
#    {
#           "Name" => "Jonathan Doe",
#            "Age" => "23",
#        "Formula" => "a + b == 13%!"
#    }

最后,一些不请自来的建议:写入 STDOUT 的 putsap 在开发中往往工作得很好,因为 Rails 的记录器也在写入 STDOUT,所以您会在与 Rails 服务器日志相同的终端窗口中看到 puts 输出。然而,在生产中,写入 STDOUT 的数据可能不会写入任何地方的文件,即使是这样,如果您在某个时刻更改 Rails.logger 配置,ap 的输出可能仍会流向其他地方。您可能想要的是使用 Rails 的记录器而不是 putsap,这样您就可以确保所有输出都到达同一位置。幸运的是,awesome_print 为每个对象添加了一个 awesome_inspect 方法,该方法返回与使用 ap 时看到的相同的漂亮字符串,因此您仍然可以将 Awesome_print 与 Rails 一起使用。记录器:

body_inspect = Rack::Utils.parse_query(body).awesome_inspect
Rails.logger.info("Request body is:\n#{body_inspect}")

关于ruby-on-rails - 如何从表单编码字符串中获得 pretty-print 效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631502/

相关文章:

ruby - 无法让 awesome_print gem 工作

ruby-on-rails - awesome_print 未显示关联对象

ruby-on-rails - 您如何使用 "DELETE"HTTP 动词发送请求?

javascript - Rails 根据下拉菜单选择填充文本区域

javascript - 动态更改 HTML 表的 ID

heroku - 我怎样才能使awesome_print成为heroku控制台中的默认值?

ruby-on-rails - Rails 配置 keystore 返回 nil

ruby-on-rails - Rails 如何为每个元素构建具有不同 url 的面包屑?

Ruby 的 awesome_print 到 STDERR