在rails上的ruby中没有将String隐式转换为Integer错误

问题描述 投票:-3回答:1

我希望从我的rails视图中访问1_1 1_2 1_3中的每一个,现在我如何在我的Odd类中定义每一个来访问它们?我在这行no implicit conversion of String into Integer上得到这个错误Odd.new(args.fetch("1_1", {}))

Json的回应:

{
    "success": 1,
    "results": {
        "1_1": [
            {
                "id": "1976855",
                "home_od": "501.000",
                "draw_od": "17.000",
                "away_od": "1.025",
                "ss": "0:1",
                "time_str": "91",
                "add_time": "1480296195"
            }
],
        "1_2": [
            {
                "id": "1976855",
                "home_od": "501.000",
                "draw_od": "17.000",
                "away_od": "1.025",
                "ss": "0:1",
                "time_str": "91",
                "add_time": "1480296195"
            }
],
        "1_3": [
            {
                "id": "1976855",
                "home_od": "501.000",
                "draw_od": "17.000",
                "away_od": "1.025",
                "ss": "0:1",
                "time_str": "91",
                "add_time": "1480296195"
            }
]
}
}

奇怪的模特

module Bapi
  class Odd < Base

    attr_accessor :event_id,
                  :full_time

   CACHE_DEFAULTS = { expires_in: 7.day, force: false }
   def self.find(query = {})
      cache = CACHE_DEFAULTS
      response = Request.where("/v1/event/odds",CACHE_DEFAULTS, query)
      inplaies = response.fetch('results',[]).map { |odd| Odd.new(odd) }
      inplaies
    end


    def initialize(args = {})
      super(args)
      self.full_time =  parse_1x2(args)
    end

    def parse_1x2(args = {})
      Odd.new(args.fetch("1_1", {}))
    end

  end
end
ruby-on-rails ruby ruby-on-rails-5.2
1个回答
0
投票

当你这样做

inplaies = response.fetch('results',[]).map { |odd| Odd.new(odd) }

你是说让我得到所有回应的“结果”

{
   "1_1": [{}], 
   "1_2": [{}],
 }

到现在为止还挺好。然后你就此调用.map。当您调用.map时,它会将该散列的每个元素转换为2个元素数组,第一个元素作为键,第二个元素作为值。所以你的变量'奇数'现在看起来像这样:

["1_1", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]]
["1_2", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]]
["1_3", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]]

然后你将每个数组元素传递给Odd.new,所以你有效地做了:

Odd.new(["1_1", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]])

正如我在评论中提到的,你的Odd初始化程序需要一个哈希值,但是你提供的是这个数组。

最后它打电话

parse_1x2(args)

你的论点是

parse_1x2(["1_1", [{"id"=>"1976855", "home_od"=>"501.000", "draw_od"=>"17.000", "away_od"=>"1.025", "ss"=>"0:1", "time_str"=>"91", "add_time"=>"1480296195"}]])

但是这种方法需要散列。

在数组上调用.fetch时,它希望您提供数字索引。但是你用“1_1”调用.fetch,这是一个字符串,因为你希望“args”在那里是一个哈希。

您可以通过启动Rails控制台并执行以下操作来查看此操作:

[1,2,3].fetch(0) # will work
[1,2,3].fetch("some string key") # will fail with the same error you're getting

你想在这里做的是开始运行,将你的2元素数组转换为哈希值:

更改

inplaies = response.fetch('results',[]).map { |odd| Odd.new(odd) }

inplaies = response.fetch('results',[]).map { |odd| Odd.new([odd].to_h) }

有了这个,你将你的2元素数组转换回Hash,这是你以后在代码中所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.