Ruby on rails 如何从表单编码字符串获得漂亮的打印效果

Ruby on rails 如何从表单编码字符串获得漂亮的打印效果,ruby-on-rails,awesomeprint,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.u

各位好。 如何强制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
也只是一个字符串,它是表单编码的数据,如下所示(从中窃取):

Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21
就像
“请求主体是…”
示例一样,awesome\u 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.parse
Rack::Utils.parse_query
解析表单数据,这两种方法都可以在Rails中使用。它们都返回一个哈希值,您可以将其提供给awesome\u print,但稍微有点问题不同的格式(CGI以数组的形式返回所有值,Rack::Utils仅当它们是“数组”格式时才返回,例如
foo[]=1&foo[]=2
)。以下是Rack::Utils(您只需想象输出是彩色的):

最后,一点未经请求的建议:
put
ap
,它们写入到STDOUT,在开发过程中往往工作得很好,因为Rails的记录器也在向STDOUT写入数据,所以您可以在与Rails服务器日志相同的终端窗口中看到
put
输出如果您在某个点更改了
Rails.logger
配置,则
ap
的输出可能仍在其他地方。您可能希望使用Rails的logger,而不是
put
ap
,这样您就可以确保所有输出都在同一个位置。幸运的是,awesome_print为每个对象添加了一个
awesome_inspect
方法,该方法返回的字符串与您使用
ap
时看到的字符串相同,因此您仍然可以将awesome_print与
Rails一起使用。logger

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

request.body
只是一个表单编码的字符串,比如
foo=1&bar=2&……
。你能编辑你的问题,给我们一个你希望输出的例子吗?谢谢。根据这一新的见解重新设计了问题。我不太清楚你在做什么,但我建议你安装它,看看它是否能解决你的问题lem。这是一个暗中操作的建议,但pry rails是我的工具,不管怎样。这很好,但pry仍然将request.body字符串打印为一个长的单行字符串,而不是一个对象。我不清楚为什么不检查
self.to_params
,因为这是您输入到req中的数据uest。如果您解码表单数据,您将再次获得相同的数据。谢谢。很快将尝试该解析查询!
body_inspect = Rack::Utils.parse_query(body).awesome_inspect
Rails.logger.info("Request body is:\n#{body_inspect}")