【问题标题】:Ruby on Rails can't convert String into Integer [closed]Ruby on Rails 无法将字符串转换为整数 [关闭]
【发布时间】:2013-09-23 05:49:16
【问题描述】:

我将 JSON 数据发送到解析它的控制器。

ROR 代码

Class.where(challenge_id:challenge.id,song_id:song_hash['song_id']).first

错误是

can't convert String into Integer

我什至将song_id:song_hash['song_id'] 更改为song_id:song_hash['song_id'].to_i,但它没有用

哈希数据是

{"session_token"=>"Xt9toEzHI3bYXeJNkenyqg", "challenge"=>{"challenge_id"=>"15", "player_name"=>"usman", "guessed_songs"=>{"0"=>{"song_id"=>"10", "guessed"=>"YES"}, "1"=>{"song_id"=>"11", "guessed"=>"YES"}, "2"=>{"song_id"=>"12", "guessed"=>"YES"}, "3"=>{"song_id"=>"13", "guessed"=>"YES"}, "4"=>{"song_id"=>"15", "guessed"=>"YES"}}, "player_status"=>{"0"=>{"coins"=>"20", "points"=>"0", "player_name"=>"usman"}, "1"=>{"coins"=>"20", "points"=>"0", "player_name"=>"Usman"}}}}

找不到未转换为整数的内容

【问题讨论】:

  • 您提供的 JSON DATA 根本不是 json。 {"song_id":q1,"guessed":"YES"} 不是 json。 {"song_id":"q1","guessed":"YES"} 是 json。注意双引号
  • 除此之外,线索是“song_id”:q1。 q1 什么都不是。不是字符串,也不是整数。但是rails期望song_id是一个整数,但它无能为力
  • @Vineeth 实际上 Q1、Q2 是变量。数据是整数假设 1,2,3,4,5.. 我编辑了 Q
  • 这是什么challenge.id ?是整数吗
  • 你能用 pry 或 debugger 来检查前一行,然后发布 challenge.id 和 song_hash['song_id'] 的值吗?

标签: ruby-on-rails ruby json hash


【解决方案1】:

我猜你的song_hash 根本不是一个哈希,它是一个数组。大概这个数组来自传入的数据:

"guessed_songs":[{"song_id":1,"guessed":"YES"},{"song_id":2,"guessed":"YES"},{"song_id":3,"guessed":"YES"},{"song_id":4,"guessed":"YES"},{"song_id":5,"guessed":"YES"}],

您看到的错误几乎总是试图索引数组的结果,就好像它是一个哈希一样。例如:

>> song_hash = [ ]
>> song_hash['song_id']
TypeError: can't convert String into Integer

您的代码中唯一的索引是:

song_hash['song_id']

这肯定是用字符串索引的东西,因此它与您看到的 TypeError 匹配。将其更改为:

song_hash['song_id'].to_i

不会有帮助,因为有问题的 [] 方法将在 to_i 有机会做任何事情之前被调用。

【讨论】:

    【解决方案2】:

    试试这个:

    song_id:song_hash[:song_id]

    【讨论】:

      【解决方案3】:

      可能您的任何字段(challenge_id, song_id) 都是整数,但您将其插入字符串 在你的json里还有很多不明白的东西challenge_id":cId是整数吗

      根据你的

      所有歌曲ID

            irb(main):016:0* song_hash = {"guessed_songs"=>{"0"=>{"song_id"=>"10", "guessed"=>"YES"}, "1"=>{"song_id"=>"11", "guessed"=>"YES"}, "2"=>{"song_id"=>"12", "guessed"=>"YES"}, "3"=>{"song_id"=>"13", "guessed"=>"YES"}, "4"=>{"song_id"=>"15", "guessed"=>"YES"}}}
      
            => {"guessed_songs"=>{"0"=>{"song_id"=>"10", "guessed"=>"YES"}, "1"=>{"song_id"=>"11", "guessed"=>"YES"}, "2"=>{"song_id"=>"12", "guessed"=>"YES"}, "3"=>{"song_id"=>"13", "guessed"=>"YES"}, "4"=>{"song_id"=>"15", "guessed"=>"YES"}}}
      
      
            irb(main):018:0> song_hash["guessed_songs"].each do |key,song|
            irb(main):019:1* puts song["song_id"].to_i
            irb(main):020:1> end
            =>10
            =>11
            =>12
            =>13
            =>15
            => {"0"=>{"song_id"=>"10", "guessed"=>"YES"}, "1"=>{"song_id"=>"11", "guessed"=>"YES"}, "2"=>{"song_id"=>"12", "guessed"=>"YES"}, "3"=>{"song_id"=>"13", "guessed"=>"YES"}, "4"=>{"song_id"=>"15", "guessed"=>"YES"}}
      

      所以在循环中你可以试试这个

                 pm=PlaylistMembership.where(challenge_id:challenge.id,song_id:song["song_id"].to_i).first
      

      【讨论】:

      • 试过了,不行...
      • challenge 是什么?你做了challenge.id
      • 请把你的song_hash
      • #<0x15cb784f>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      相关资源
      最近更新 更多