2013-09-23 7 views
0

Я отправляю данные JSON контроллеру, который анализирует его.Ruby on Rails не может преобразовать String в Integer

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, но он не работает

Hash DATA является

{"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"}}}} 

Не удалось найти то, что не преобразовать в целое

+1

ДАННЫЕ JSON, которые вы предоставили, вовсе не 'json'. '{" song_id ": q1," догадались ":" YES "}' не 'json'. {"song_id": "q1", "guess": "YES"} - 'json'. Обратите внимание на двойные кавычки – Vineeth

+1

Кроме того, ключом является «song_id»: q1. q1 НИЧЕГО. Не строка, не целое число. Но рельсы ожидают, что song_id будет целым числом, но его беспомощный – Vineeth

+0

@Vineeth фактически Q1, Q2 - переменные. данные в целом равны 1,2,3,4,5. Я отредактировал Q –

ответ

6

Я предполагаю, что ваш song_hash это на самом деле не 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"}], 

Ошибка вы видите, это почти всегда является результатом попыток индекса массива, как если бы это был Hash. Например:

>> 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 получает шанс сделать что-нибудь.

0

Возможно любое из ваших полей (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 
+0

попробовал, не работал ... –

+0

что такое 'challenge'? вы сделали 'challenge.id' –

+0

, пожалуйста, положите свою' song_hash' –

Смежные вопросы