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

时间:2018-07-03 15:10:41

标签: ruby-on-rails ruby github-api

我正在关注this tutorial以连接到GitHub API。我可以成功连接并恢复当前已验证的用户信息。

但是我试图找回用户的仓库,响应是一个对象数组。

我不知道如何将其传递给视图。在我所关注的教程中,请查看recipe.rbhere

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.rb

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.rb

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 %>

2 个答案:

答案 0 :(得分:1)

您需要实现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

答案 1 :(得分:0)

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

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

我不知道为什么我以前没看到这个,我想我很沮丧