如何根据 Rails 上 Ruby 中的 API 响应创建对象数组

How to create an array of objects from API response in Ruby on Rails

我正在关注 this tutorial 以连接到 GitHub API。我可以成功连接并带回当前认证的用户信息。

但是我试图取回用户的回购协议,响应是一个对象数组。

我不知道如何将其传递给视图。从我正在关注的教程中,查看 recipe.rb class here.

attr_accessor :ingrediets 将用作数组(第 8 行)。在第 32 行,她将来自 API 的响应传递给自定义方法以对其进行解析,创建一个 Ingredient 对象并将其推入数组。 self.ingredients = parse_ingredients(args)

这是自定义方法

def parse_ingredients(args = {})
  args.fetch("extendedIngredients", []).map { |ingredient| Ingredient.new(ingredient) }
end

如您所见,她从 args 对象 获取 响应中的 extendedIngredients 属性 并创建数组。

我的问题是,对于 GitHub API,响应是一个普通数组,我尝试解析它并将其转换为对象数组的尝试没有成功。

这是我的repos.rbclass

module Github
  class Repos < Base
    attr_accessor :repos

    def initialize(args = [])
      self.repos = parse_repos(args)
    end

    def self.list
      response = Request.get("user/repos")
      Repos.new(response)
    end

    private

    def parse_repos(args = [])
      args.map { |repo| Repo.new(repo) }
    end
  end
end

还有我的repo.rbclass

module Github
  class Repo < Base
    attr_accessor :name,:full_name,:description            
  end
end

如果您注意到我遵循了教程的风格,但我还没有能够实现它。

在我当前的实施中,这是我认为的错误

  undefined method `each' for #<Github::Repos:0x00007feaadd494d8>
  <% @repos.each do |repo|%>
    <%= repo %>
  <% end %>

您需要按照错误提示执行each,请阅读Enumerable的第一段。

通常你可以将它传递给一个已经可以枚举的对象(比如你的例子中的 Array。)

例如

module Github
  class Repos < Base
    include Enumerable

    def self.list
      response = Request.get("user/repos")
      Repos.new(response)
    end

    def initialize(args = [])
      @repos = parse_repos(args)
    end

    def each(&block)
      @repos.each(&block)
    end

    private

    def parse_repos(args = [])
      args.map { |repo| Repo.new(repo) }
    end
  end
end

啊,我的实现是正确的,但是我需要像这样访问 repos 属性

  <% @repos.repos.each do |repo|%>
    <%= repo.name %>
  <% end %>

我不知道为什么我没有早点看到这个,我想我只是很沮丧