Ruby on Rails无法将String转换为Integer

时间:2013-09-23 05:49:16

标签: ruby-on-rails ruby json hash

我将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"}}}}

无法找到未转换为整数的内容

3 个答案:

答案 0 :(得分:6)

我猜你的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方法。

答案 1 :(得分:0)

您的任何字段(challenge_idsong_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

答案 2 :(得分:0)

试试这个:

song_id:song_hash[:song_id]