将Ruby Hash转换为带转义符的字符串



我有一个哈希,需要用转义字符转换成字符串。

{name: "fakename"}

结果应该是这样的:

'name:'fakename'

我不知道这种类型的字符串是如何调用的。也许有一种已经存在的方法,我只是不知道。。。

最后我会做这样的事情:

name = {name: "fakename"}
metadata = {}
metadata['foo'] = 'bar'
"#{name} AND #{metadata}"

最终结果是:

'name:'fakename' AND metadata['foo']:'bar''

上下文:此查询要求搜索Stripe API:https://stripe.com/docs/api/customers/search

如果可能的话,我会使用Stripe的gem。

如果您不能使用它,从gem中提取的这段代码应该可以帮助您对查询参数进行编码。

require 'cgi'
# Copied from here: https://github.com/stripe/stripe-ruby/blob/a06b1477e7c28f299222de454fa387e53bfd2c66/lib/stripe/util.rb
class Util
def self.flatten_params(params, parent_key = nil)
result = []
# do not sort the final output because arrays (and arrays of hashes
# especially) can be order sensitive, but do sort incoming parameters
params.each do |key, value|
calculated_key = parent_key ? "#{parent_key}[#{key}]" : key.to_s
if value.is_a?(Hash)
result += flatten_params(value, calculated_key)
elsif value.is_a?(Array)
result += flatten_params_array(value, calculated_key)
else
result << [calculated_key, value]
end
end
result
end
def self.flatten_params_array(value, calculated_key)
result = []
value.each_with_index do |elem, i|
if elem.is_a?(Hash)
result += flatten_params(elem, "#{calculated_key}[#{i}]")
elsif elem.is_a?(Array)
result += flatten_params_array(elem, calculated_key)
else
result << ["#{calculated_key}[#{i}]", elem]
end
end
result
end
def self.url_encode(key)
CGI.escape(key.to_s).
# Don't use strict form encoding by changing the square bracket control
# characters back to their literals. This is fine by the server, and
# makes these parameter strings easier to read.
gsub("%5B", "[").gsub("%5D", "]")
end  
end
params = { name: 'fakename', metadata: { foo: 'bar' } }
Util.flatten_params(params).map { |k, v| "#{Util.url_encode(k)}=#{Util.url_encode(v)}" }.join("&")

我现在把它和那个字符串一起使用,它可以工作。。。向前倾斜:

"email:'#{email}'"

email = "test@test.com"
key = "foo"
value = "bar"
["email:'#{email}'", "metadata['#{key}']:'#{value}'"].join(" AND ")
=> "email:'test@test.com' AND metadata['foo']:'bar'"

被Stripe API 接受

最新更新