Вызов API Ruby on Rails от контроллера со слишком большой логикой. Где и как я могу сделать это проще?

#ruby-on-rails #ruby #api #controller #httparty

Вопрос:

Меня попросили принести API покемонов из Ruby on Rails. Но я борюсь, потому что у меня слишком много логики в контроллере, что не рекомендуется. Где и как я могу позвонить, чтобы у меня было меньше логики внутри моего контроллера. У меня есть это:

 def index
    pokemons = []
    response = HTTParty.get("https://pokeapi.co/api/v2/pokemon?limit=6amp;offset=1")
    response = JSON.parse(response.body)
    response.each do |k, value|
        if k == "results"
            value.each do |key, val|
            response = HTTParty.get(key["url"])
            response = JSON.parse(response.body)
            pokemons.push(response)
            end
        end
    end

        @poke_json = pokemons.map do |poke|
            Pokemon.new(img:poke['sprites']['other']['dream_world']["front_default"], name: poke['forms'][0]['name'], weight: poke['weight'], poke_type: poke['types'][0]['type']['name'], poke_ability: poke['abilities'][0]['ability']['name'], poke_id: poke['id'])
                                                    
        end
    render json: { pokemons: @poke_json }
  end ``` 
 

Ответ №1:

В качестве первого шага вы можете самостоятельно извлечь код, зависящий от клиента API, в класс:

 # in app/models/pokemon_api.rb
class PokemonApi
  def self.to_json
    pokemons = []

    response = HTTParty.get("https://pokeapi.co/api/v2/pokemon?limit=6amp;offset=1")
    response = JSON.parse(response.body)
    response.each do |k, value|
      if k == "results"
        value.each do |key, val|
          response = HTTParty.get(key["url"])
          response = JSON.parse(response.body)
          pokemons.push(response)
        end
      end
    end

    pokemons.map do |poke|
      Pokemon.new(
        img:poke['sprites']['other']['dream_world']["front_default"],
        name: poke['forms'][0]['name'], weight: poke['weight'], 
        poke_type: poke['types'][0]['type']['name'], 
        poke_ability: poke['abilities'][0]['ability']['name'], 
        poke_id: poke['id']
      )
    end
  end
end
 

а затем просто вызовите этот метод в своем контроллере

 def index
  render json: { pokemons: PokemonApi.to_json }
end
 

Комментарии:

1. Идеально!! Спасибо за вашу помощь! Я просто не создавал новый класс API. Просто создал метод api_call внутри модели Pokemon, и он работает.