【问题标题】:How to create an array of objects from json response如何从 json 响应创建对象数组
【发布时间】:2018-08-15 08:03:37
【问题描述】:

我得到这个错误:

["id", "6309"]:Array 的未定义方法 `name'

我想为每个响应 inplay 事件显示联赛名称

Json 响应:

{
    "success": 1,
    "pager": {
        "page": 1,
        "per_page": 50,
        "total": 21
    },
    "results": [
        {
            "id": "222434",
            "time": "1489669200",
            "time_status": "1",
            "league": {
                "id": "4148",
                "name": "Viareggio Cup",
                "cc": null
            },
            "home": {
                "id": "43717",
                "name": "Fiorentina U19",
                "image_id": "42466",
                "cc": "it"
            },
            "away": {
                "id": "159690",
                "name": "Garden City Panthers FC U19",
                "image_id": "320141",
                "cc": null
            },
            "timer": {
                "tm": 86,
                "ts": 4,
                "tt": "1"
            },
            "scores": {
                "2": {
                    "home": "2",
                    "away": "0"
                }
            }
        },
        {
            "id": "223265",
            "time": "1489669200",
            "time_status": "1",
            "league": {
                "id": "1501",
                "name": "Uganda Division 2",
                "cc": "ug"
            },
            "home": {
                "id": "159745",
                "name": "Simba FC",
                "image_id": null,
                "cc": null
            },
            "away": {
                "id": "80323",
                "name": "Busia Fisheries",
                "image_id": null,
                "cc": null
            },
            "timer": {
                "tm": 69,
                "ts": 1,
                "tt": "1"
            },
            "scores": {
                "2": {
                    "home": "1",
                    "away": "2"
                }
            }
        },
    ]
}

module Bapi
  class Inplay < Base
    attr_accessor :id,
                  :time,
                  :time_status,
                  :league

    CACHE_DEFAULTS = { expires_in: 7.days, force: false }

    def self.all(query = {})
      response = Request.where("/v2/events/inplay",query, CACHE_DEFAULTS)
      events = response.fetch('results', []).map { |inplay| Inplay.new(inplay) }
      [ events, response[:errors] ]
    end

    def initialize(args = {})
      super(args)
      league = parse_leagues(args)
    end


     private

    def parse_leagues(args = {})
      args.fetch("league", []).map { |league| League.new(league) }
    end
  end
end

 module Bap
     class Base
        attr_accessor :errors

        def initialize(args = {})
          args.each do |name, value|
            attr_name = name.to_s
            send("#{attr_name}=", value) if respond_to?("#{attr_name}=")
          end
        end
      end
    end

联赛模特

module Bapi
  class League < Base
    attr_accessor :id,
                  :name,
                  :cc
  end
end

控制器:

@events, @errors = Bapi::Inplay.all

观看次数:

<% @events.each_slice(3) do |events| %>
    <% events.each do |event| %>
     <% event.league.each do |leg| %>
            <%= leg.name %>      
     <% end %>
    <% end %>
  <% end %>
 <% end %>

[#<Bap::Inplay:0x00007feceede0570 @id="873482", @time="1534143600", @time_status="1", @league={"id"=>"6309", "name"=>"China Super League Reserves", "cc"=>"cn"}>, #<Bap::Inplay:0x00007feceedeb6f0 @id="875996", @time="1534147192", @time_status="1", @league={"id"=>"3653", "name"=>"Indonesia Cup", "cc"=>"id"}>]

当我像这样更改代码时,它工作正常


   <% @events.each_slice(3) do |events| %>
        <% events.each do |event| %>
         <%= event.time %>
         <%= event.time_status %>         
        <% end %>
      <% end %>
     <% end %>

编辑: 我找到了这个
现在我如何定义一个变量以将参数转换为(键值),当我使用键时,它的返回值

    <% @events.each_slice(3) do |events| %>
        <% events.each do |event| %>
     <% event.league.each do |k,v| %>
            <%= k %> <br>
            <%= v %>         
       <% end %>      
    <% end %>
  <% end %>
 <% end %>

【问题讨论】:

  • 如果您可以生成一个更小的代码示例来重现问题,这可能会有所帮助。

标签: ruby-on-rails json ruby ruby-on-rails-5


【解决方案1】:

我猜问题出在这个方法上:

def initialize(args = {})
  super(args)
  league = parse_leagues(args)
end

联赛被解析并设置为一个局部变量,但预计会设置为一个实例:

def initialize(args = {})
  super(args)
  @league = parse_leagues(args)
end

否则,将调用来自Base 的默认实现并将@league 设置为原始值(散列)

而且parse_leagues 方法也应该被修复(并且可能重命名为parse_league,因为原始值不是一个数组,而是一个哈希):

def parse_leagues(args = {})
  League.new(args.fetch("league", {}))
end

然后在视图中使用如下:

<% @events.each_slice(3) do |events| %>
  <% events.each do |event| %>
    <%= event.league.name %>    
  <% end %>
<% end %>

【讨论】:

  • 它的反应是假的
  • @Gasem 你能详细说明一下吗?
  • 当我使用@league 初始化它时,它什么都不返回,并且视图中没有任何错误,当我使用&lt;%= event.league.present? %&gt; 它返回false
  • @Gasem 更新了我的答案,没有注意到,“league”的原始值是一个哈希值,而不是一个数组
  • 感谢它的帮助,但仍然无法正常工作,使用@league 时返回此错误undefined method 'each' for #&lt;Bapi::League:&gt;
猜你喜欢
  • 2022-07-30
  • 2018-11-08
  • 2019-06-22
  • 1970-01-01
  • 2022-11-13
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多