【问题标题】:Putting Variable with in single quotes?将变量放在单引号中?
【发布时间】:2015-10-15 14:23:20
【问题描述】:

大家好,我正在向 Campaign Monitor API 发出请求,数据必须以单引号作为字符串保存,但格式为 JSON。因为它必须是单引号,所以我无法输入任何变量值。下面是代码。

response = HTTParty.post(url, 
:basic_auth => auth, :body => '{
            "EmailAddress":"js@mike.com",
            "Name":"#{@fname}",
            "CustomFields":[
                  {
                            "Key":"firstName",
                            "Value":"#{@fname}"
                        },
                        {
                          "Key":"country",
                            "Value":"#{@country}"
                        }
                        ],
            "Resubscribe":true,
            "RestartSubscriptionBasedAutoresponders":true
        }')

我尝试了几种不同的方法,例如将字符串分解并将其与带双引号的变量拼凑在一起,但同样失败了,要使请求成功,它必须是准确的。

【问题讨论】:

  • 这完全没有意义。字符串就是字符串,不管它是定义为单引号字符串文字、双引号字符串文字、heredoc 还是粉色魔法独角兽。 HTTParty::post 方法根本无法区分单引号和双引号,这只是字符串文字的语法,甚至无法通过解析过程。

标签: ruby json api


【解决方案1】:

您可以构建一个 Ruby 哈希并将其转换为 JSON,而不是手动构建 JSON 结构:

require 'json'

data = {
  'EmailAddress' => 'js@mike.com',
  'Name' => @fname,
  'CustomFields' => [
    { 'Key' => 'firstName', 'Value' => @fname },
    { 'Key' => 'country', 'Value' => @country }
  ],
  'Resubscribe' => true,
  'RestartSubscriptionBasedAutoresponders' => true
}

response = HTTParty.post(url, basic_auth: auth, body: data.to_json)

另请注意,Campaign Monitor API 有一个 Ruby gem:createsend-ruby

使用 gem,上面的代码转换为:

custom_fields = [
  { 'Key' => 'firstName', 'Value' => @fname },
  { 'Key' => 'country', 'Value' => @country }
]
response = CreateSend::Subscriber.add(auth, list_id, 'js@mike.com', @fname, custom_fields, true, true)

【讨论】:

    【解决方案2】:

    你可以试试heredoc

    response = HTTParty.post(url, 
      :basic_auth => auth, :body => <<-BODY_CONTENT
      {
            "EmailAddress":"js@mike.com",
            "Name":"#{@fname}",
            "CustomFields":[
                  {
                            "Key":"firstName",
                            "Value":"#{@fname}"
                        },
                        {
                          "Key":"country",
                            "Value":"#{@country}"
                        }
                        ],
            "Resubscribe":true,
            "RestartSubscriptionBasedAutoresponders":true
      }
    BODY_CONTENT
    )
    

    【讨论】:

    • 完美运行的真棒:) 你介意解释一下我以前从未见过的这个概念是如何工作的。再次感谢:)
    • 这只是允许多行字符串内容的语法。它像双引号一样工作(您可以添加变量值),但字符串内容的开头由&lt;&lt;[KEYWORD] 定义,结尾将出现在仅包含[KEYWORD] 的行中。我在答案中给你的链接完美地描述了语法和heredoc给你的所有机会。
    【解决方案3】:

    您可以按照here的说明使用heredoc

    如果你把双引号放在周围,也遵循双引号规则 标识符。但是,不要将双引号括起来 终结者。

    puts <<"QUIZ"
    Student: #{name}
    
    1.\tQuestion: What is 4+5?
    \tAnswer: The sum of 4 and 5 is #{4+5}
    QUIZ
    

    【讨论】:

      【解决方案4】:

      您可以使用这里的文档:

      name = 'John'
      <<EOS
      This is #{name}
      EOS
      

      您也可以使用灵活的引号,它们可以同时处理'" 字符:

      name = 'John'
      %{
      This is #{name}
      }
      

      灵活的引用也适用于%()%!!

      【讨论】:

        猜你喜欢
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 1970-01-01
        • 2017-03-11
        • 2020-02-14
        • 1970-01-01
        相关资源
        最近更新 更多