我正试图替换将用于调用Elastic search的大型搜索字符串中的一个变量,但似乎无法将该变量放入字符串中。以下是我所尝试的,使用字符串插值尝试在3个不同的位置将my_var
添加到搜索字符串中。
my_var = "foo"
search_string = '{"query":{"bool":{"must":[{"nested":{"path":"some_status", "query":{"bool":{"must":{"terms":{"status.code":["ACTIVE"]}}}}}}, {"bool":{"should":[{"nested":{"path":"acc", "query":{"bool":{"must":[{"match_phrase":{"acc.name.text":"{#my_var}"}}]}}}}, {"bool":{"must":[{"match_phrase":{"name.stuff":"{#my_var}"}}]}}, {"nested":{"path":"trade_names", "query":{"bool":{"must":[{"match_phrase":{"some_names.some_name.stuff":"{#my_var}"}}]}}}}]}}]}}}'
JSON.parse(search_string)
我在这里做错了什么?
首先,它是#{my_var}
,而不是{#my_var}
。
除了打字错误之外,字符串插值还需要"..."
,它在'...'
:中被禁用
foo = 123
str = "foo = #{foo}" # <- turns #{foo} into 123
#=> "foo = 123"
str = 'foo = #{foo}' # <- keeps #{foo} literally
#=> "foo = #{foo}"
由于您的字符串包含许多文本双引号字符,因此使用"..."
会添加许多转义字符。
除了引号,您还可以使用百分比字符串%Q(...)
:
str = %Q({"foo":"#{foo}"})
#=> "{"foo":"123"}"
或heredoc:(使用JSON
作为分隔符可能会在编辑器中启用语法高亮显示(
str = <<-JSON.chomp
{"foo":"#{foo}"}
JSON
#=> "{"foo":"123"}"
另一种选择是构造一个Ruby哈希并将其转换为JSON:
require 'json'
hash = { 'foo' => foo }
str = hash.to_json
#=> "{"foo":123}"
JSON库还为您处理转义。