【问题标题】:Why is #{} not adding the value to the string?为什么 #{} 不将值添加到字符串中?
【发布时间】:2014-07-22 17:12:53
【问题描述】:

使用httparty 我正在向:

https://api.marktplaats.nl/api3/categories.json?oauth_token=1me6jq76h8t6rim747m7bketkd&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0

代码 A:

require 'httparty'

class Marktplaats  
  def categories
    HTTParty.get('https://api.marktplaats.nl/api3/categories.json?oauth_token=1me6jq76h8t6rim747m7bketkd&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0')
  end
end

代码 B:

require 'httparty'

class Marktplaats
  @oauth_token = '1me6jq76h8t6rim747m7bketkd'

  def categories
    HTTParty.get("https://api.marktplaats.nl/api3/categories.json?oauth_token=#{@oauth_token}&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0")
  end
end

做的时候:

m = Marktplaats.new
m.categories

代码 A 有效,但代码 B 无效。

在代码 B 的 GET 调用上调用 .request.last_uri.to_s 返回:

https://api.marktplaats.nl/api3/categories.json?oauth_token=&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0

可能出了什么问题?

【问题讨论】:

  • 我的建议是使用 constant,如果值不因实例而异...
  • 养成使用内置URI 模块或Addressable::URI 操作URL 的习惯。他们将为您处理直接注入字符串无法解决的编码问题。
  • 感谢两位的建议。

标签: ruby httparty


【解决方案1】:

这是在类级别实例级别定义变量的情况。您已经在类级别定义了@oauth_token,但试图在实例级别使用它并且不能。尝试将您的代码更改为:

class Marktplaats
  def initialize
    @oauth_token = '1me6jq76h8t6rim747m7bketkd'
  end

  def categories
    HTTParty.get("https://api.marktplaats.nl/api3/categories.json?oauth_token=#{@oauth_token}&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0")
  end
end

或对此,它使用在类和实例级别都可访问的常量(但永远不应更改)。:

class Marktplaats
  OAUTH_TOKEN = '1me6jq76h8t6rim747m7bketkd'

  def categories
    HTTParty.get("https://api.marktplaats.nl/api3/categories.json?oauth_token=#{OAUTH_TOKEN}&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0")
  end
end

【讨论】:

  • 那不是类变量。它是类对象中的一个实例变量。一个微妙但重要的区别。
【解决方案2】:

您正在创建一个类实例变量,但在您的方法中使用了一个局部实例变量。改为这样做:

require 'httparty'

class Marktplaats
  OAUTH_TOKEN= '1me6jq76h8t6rim747m7bketkd'

  def categories
    HTTParty.get("https://api.marktplaats.nl/api3/categories.json?oauth_token=#{OAUTH_TOKEN}&api_ver=3.7&session=ebc565b8-659f-40f6-9d0a-96986f1d1595&screenWidth=62&screenHeight=111&app_ver=Android3.1.0")
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2014-10-07
    相关资源
    最近更新 更多