Techioz Blog

Ruby の to_i メソッドはゼロを返します

概要

Ruby の to_i メソッドがゼロを返します。文字列を整数に変換せずにゼロを返す理由はわかります。

              job_id = job_template_id[index]
               @handle.log(:info, "job_id is:  #{job_id}")
              job_id = job_id.to_i
              @handle.log(:info, "job_id 2 is:  #{job_id}")



[----] I, [2022-03-24T09:23:29.327746 #328:2aebe6eaa0a4]  INFO -- automation: Q-task_id([r382_miq_provision_1347]) <AEMethod launch_ansible_job> job_template_id is:  "39"
[----] I, [2022-03-24T09:23:29.328220 #328:2aebe6eaa0a4]  INFO -- automation: Q-task_id([r382_miq_provision_1347]) <AEMethod launch_ansible_job> job_id is:  "39"
[----] I, [2022-03-24T09:23:29.328778 #328:2aebe6eaa0a4]  INFO -- automation: Q-task_id([r382_miq_provision_1347]) <AEMethod launch_ansible_job> job_id 2 is:  0

job_template_id は配列です。

job_template_id => ["39", "40"]

解決策

job_template_id が [‘“39”’, ‘“40”’] ではなく [‘39’, ‘40’] でよろしいですか?

irb で次のように考えてみましょう。

irb > job_id = "39"
 => "39" 
irb > puts "job_id is #{job_id}"
job_id is 39
 => nil 
irb > job_id.to_i
 => 39

補間された文字列には引用符がありません。ただし、内部引用符がある場合は、文字列補間と #to_i 呼び出しの両方で何が表示されるかがわかります。

irb > job_id = '"39"'
 => "\"39\"" 
irb > puts "job_id is #{job_id}"
job_id is "39"
 => nil 
irb > job_id.to_i
 => 0 

job_template_id の要素内に余分な引用符があります。おそらく #inspect を使用して job_template_id を設定しているか、二重 JSON エンコーディングを行っている可能性があります。 job_template_id を構築するコードを見て、余分な引用符がどこから来ているかを確認してみます。また、job_template_id の名前を job_template_ids に変更します。配列には複数の名前を付ける必要があります。