Ruby on rails 如何从表单编码字符串获得漂亮的打印效果
各位好。 如何强制request.body(或任何其他非JSON字符串)以漂亮的多行JSON或yaml样式打印出来 我看到过将这些字符串转换为真正的JSON的奇特方法,但希望避免使用另一种方法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
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}")