Нет неявного преобразования строки в целочисленную ошибку в рубине на рельсах

Я хочу получить доступ к каждому из 1_11_21_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

Мне кажется, что в response.fetch ('results', []). Map {| odd | Odd.new (odd)}, вы говорите, что если не можете найти ключ результатов из ответа, по умолчанию используется пустой массив. Затем вы передаете этот пустой массив Odd.new, который ожидает хеширования.

Billy Kimble 13.09.2018 21:55

@bkimble, когда я использую response['results']['1_1'], его работу, но я хочу, чтобы карта json ответила и определила каждый из них

Qasem 13.09.2018 21:59
3
2
1 460
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда ты делаешь

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 для массива, он ожидает, что вы предоставите числовой индекс. Но вы вызываете .fetch с «1_1», которое является строкой, потому что вы ожидаете, что «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

Что вы хотите сделать здесь, чтобы оторваться от земли и начать работу, так это снова преобразовать ваш двухэлементный массив в хеш:

Изменять

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

К

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

Таким образом, вы конвертируете свой массив из двух элементов обратно в хэш, чего вы ожидаете позже в коде.

Другие вопросы по теме