如何根据 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.rb
class
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
class
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 %>
我不知道为什么我没有早点看到这个,我想我只是很沮丧
我正在关注 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.rb
class
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
class
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 %>
我不知道为什么我没有早点看到这个,我想我只是很沮丧