我在Ruby中使用API。我构建了自己的模型,可以与HTTParty一起使用api并获取数据。以下是我正在做的事情的一个例子:
tweets = Twitter::Tweets.all
first_tweet = tweets.first
这不会返回任何错误,但在tweets
内,我们现在有一个包含所有推文的列表。 (我们将其存储在NoSQL DB中,以解决性能和速率限制问题。)现在,我们想知道我们的第一条推文何时被创建:
first_tweet.created_at
# => undefined method `created' for #<Hash:0x007ff3491062d0>
那太糟糕了......好的。它是一个哈希,所以我们尝试:
first_tweet['created_at']
# => "2014-04-07T08:37:47+00:00"
真棒!但是,我会做很多事情。
关键问题:有没有办法使用方法代替键?
修改:
我理解我可以使用OpenStruct
或宝石。谢谢你让我知道。我想现在的问题是:是否有一种有效的(和干的)方法将其实现到模型中?
这是我们的模型可能会是什么样子:
# app/models/twitter/tweet.rb
module Twitter
class Tweet < Twitter::Base
class << self
def all
get '/v1/tweets.json'
end
end
end
end
Twitter::Base
为了简要说明我们的配置:
# app/models/twitter/base.rb
module Twitter
class Base < ActiveRecord::Base
include HTTParty
base_uri 'api.twitter.com'
format :json
default_params api_password: ENV['TWITTER_PASSWORD']
end
end
虽然,我可以这样做:
def all
tweets = get('/v1/tweets.json')
array = []
tweets.each do |tweet|
array << OpenStruct.new(tweet)
end
return array
end
但是每个方法编写一个openstruct会有很多工作要做。我想我会在接下来的几天里探索它并回答我自己的问题,如果没有人知道干旱和可扩展的方式来实现它。
提醒:实际上并没有处理twitter api,但用例保持不变。
答案 0 :(得分:2)
你可以修补哈希...(或创建一个继承的类),以便检查任何无法识别的方法,看它是否是哈希的关键
class Hash
alias_method :original_method_missing, :method_missing
def method_missing(method, *args, &block)
if self.has_key?(method.to_s)
self[method.to_s]
else
original_method_missing(method, *args, &block)
end
end
end
如果它是'具有无差别访问权限的哈希',那么在rails中可能不需要“to_s”
答案 1 :(得分:1)
Hashies(https://github.com/intridea/hashie)在模拟对象行为方面非常出色。现在,您可能想要创建一个真正的Tweet对象...