[英]Why is this ruby method not being defined in my class?
这是代码:
module Dog
class Breed < Animal::Base
class << self
def all
get '/v1/breeds'
end
def find(hashed_id)
get "/v1/breeds/#{breed_id}"
end
end
def bark
"woof"
end
end
end
对于基础:
module Dog
class Base < ActiveRecord::Base
include HTTParty
base_uri 'https://api.dogs.com'
format :json
default_params api_password: ENV['ANIMAL_PASSWORD']
end
end
module HTTParty
module ClassMethods
def get(path, options = {}, &block)
response = perform_request(Net::HTTP::Get, path, options, &block)
if response.is_a? Array
methodize_array response
elsif response.is_a? Hash
new_ros response
end
end
def methodize_array(response)
array = []
response.each do |res|
array << new_ros(res)
end
array
end
private
def new_ros(object)
RecursiveOpenStruct.new(object, recurse_over_arrays: true)
end
end
end
这是一个愚蠢的例子,但在理论上应该起作用。 发生的是我们从API中获取了一些数据。 抓取数据后,我们发现它是哈希。 我们不喜欢哈希,所以我们在HTTParty中重新打开get请求,并让它执行递归打开结构以使其成为对象。
我们将其作为Dog::Breed.all
。 我们收到一个数组,谢天谢地,ROS已将其转换为对象。
现在,当我调用Dog::Breed.all.bark
它不起作用:
undefined method `bark' for #<Array:0x007fc7acbb6108>
如果我做到了:
def self.bark
"woof"
end
然后调用Dog::Breed.bark
,它会向我Dog::Breed.bark
。 我如何做到这一点,以便可以向Breed
类添加方法,以便可以执行Dog::Breed.all.bark
或Dog::Breed.find(2).bark
?
Dog::Breed.all
的输出是#<RecursiveOpenStruct>
。 免责声明:那是一个示例案例,不是现实生活, dog.com
导致了petsmart。
Dog::Breed.all
返回一个Breed
Array
,而不是Breed
。 如果您希望所有的狗都吠叫,则需要遍历整个数组,并使每只狗吠叫:
Dog::Breed.all.each(&:bark)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.