Как создать массив объектов из ответа API в Ruby on Rails - PullRequest
0 голосов
/ 03 июля 2018

Я следую этому руководству , чтобы подключиться к GitHub API. Я могу успешно подключиться и вернуть информацию о прошедшем аутентификацию пользователя.

Однако я пытаюсь вернуть репозитории пользователя, ответом является массив объектов.

Я не знаю, как передать это в представление. Из учебника, которому я следую, взгляните на recipe.rb класс здесь .

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 в ответе и создает массив.

Моя проблема в том, что с API GitHub ответом является простой массив, и моя попытка разобрать его и превратить в массив объектов оказалась безуспешной.

Это мой 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 голосов
/ 03 июля 2018

Ах, моя реализация была правильной, ОДНАКО мне нужно было получить доступ к атрибуту repos, как этот

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

Я не знаю, почему я не видел этого раньше, наверное, я просто расстроился

0 голосов
/ 03 июля 2018

Вам нужно реализовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...