nil can’t be coerced into Fixnumを数値を入れて解決する。

WEBサービス実装中に出たエラーと解決した方法を簡単にメモしておく

DB関連のエラーでした。

今回のエラー

viewで表示している値を、足して合計を出そうとした。

<% vehicle_number_all = 0 %>
<% traveling_number_all = 0 %>
<% transport_time_all = 0 %>
.
.
.
<%= work.vehicle_number %>
<%= work.traveling_number %>
<%= work.transport_time %>
.
.
.
.
<% vehicle_number_all += work.vehicle_number %>
<% traveling_number_all += work.traveling_number %>
<% transport_time_all += work.transport_time %>
.
.
<%= vehicle_number_all %>
<%= traveling_number_all %>
<%= transport_time_all %>

こんな感じで、変数に0を代入

表示している値

0を代入した変数に、表示している値を足す

合計の変数を表示

これをRails sすると

nil can’t be coerced into Fixnum

というエラーが返ってきた。

つまり、 nilを整数にできないよ!!ってエラーらしい。

さて、どう解決するか

解決法

そもそもnilってなんだよって話を自分用にまとめておく(超基本)

「nil」は「多重代入」でも出てきましたがオブジェクトが存在していないことを表すために使用されます。例えば何もオブジェクトが代入されていない変数には「nil」が代入されているとして扱われます。

擬似変数 true, false, nil

まあこのnilさんをどうするかって話なのだけど、僕はデフォルト値を0にすることにした
(多分もっといいやり方ある)

rake db:rollback STEP=1

このコマンドを使って、最後にmigrateしたのを元の状態に戻す。

一つ前の状態に戻してくれるだけなので、とっても便利なこのコマンド。

で、

class CreateWorks < ActiveRecord::Migration
def change
create_table :works do |t|
t.integer :vehicle_number
t.integer :traveling_number
t.integer :transport_time
t.references :user, index: true, foreign_key: true

t.timestamps null: false
end
end
end

これを

class CreateWorks < ActiveRecord::Migration def change create_table :works do |t| 
t.integer :vehicle_number, :default => 0
t.integer :traveling_number, :default => 0
t.integer :transport_time, :default => 0
t.references :user, index: true, foreign_key: true

t.timestamps null: false
end
end
end

こうしました。

デフォルトを0に設定するだけっていうね。

とりあえずこれで動いた。
あとはバリデーションをちょこちょこいじる。

最後に

これで動いたには動いたけど、しっくりこないな。

またRubyOnRailsできる人に質問いこう。

DB系ももっと勉強したい感ある。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA