【问题标题】:Ruby on Rails APi call from Controller with too much logic. Where and how can I make it simpler?来自控制器的 Ruby on Rails APi 调用逻辑过多。我在哪里以及如何使它更简单?
【发布时间】:2021-09-22 03:31:00
【问题描述】:

我被要求从 Ruby on Rails 获取 Pokemon API。但是我很挣扎,因为控制器中的逻辑太多,不推荐。我可以在哪里以及如何拨打电话,这样我的控制器内部的逻辑就更少了。我有这个:

def index
    pokemons = []
    response = HTTParty.get("https://pokeapi.co/api/v2/pokemon?limit=6&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 ``` 

【问题讨论】:

    标签: ruby-on-rails ruby api controller httparty


    【解决方案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=6&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
    

    【讨论】:

    • 完美!!谢谢你的帮助!我只是没有创建新的 API 类。刚刚在 Pokemon 模型中创建了 api_call 方法,它就可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多