繁体   English   中英

为什么在我的课堂上没有定义这个ruby方法?

[英]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.barkDog::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM