LoginSignup
7
5

More than 5 years have passed since last update.

railsでオブジェクトをnewできないエラー

Last updated at Posted at 2016-08-20

事象

rails consoleから単純にnewしたら以下のエラーが表示される。
irb(main):004:0> s = Skill.new
NoMethodError: undefined method fetch_value for nil:NilClass


irb(main):007:0> s = Skill.new
NoMethodError: undefined method finder_needs_type_condition? for nil:NilClass

なんでnewが、undefindメソッドなんだろうと悩む。

skillsテーブルの定義内容は以下です。
mysql> show columns from skills;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| class | varchar(255) | YES | | NULL | |
| change_flg | tinyint(1) | NO | | 0 | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)

原因

カラム名が予約語
少し慣れている人であれば上のテーブル定義からすぐにわかると思いますが、
classがrubyの予約語です。
予約後をカラム名として利用すると発生するうようです。

対応

テーブル定義を変更しましょう。
・マイグレーションファイルを作成

$ rails g migration RenameSkillsClassColumn
invoke active_record
create db/migrate/20160819115043_rename_skills_class_column.rb

・マイグレーションファイルの中身を編集

class RenameSkillsClassColumn < ActiveRecord::Migration
def change
rename_column :skills, :class, :skill_class
end
end

・migrateの実行

$ bundle exec rake db:migrate

rails console上で再度newしてみると

irb(main):034:0> s=Skill.new
=> #<Skill id: nil, name: nil, skill_class: nil, change_flg: false, created_at: nil, updated_at: nil, type: nil, user_id: nil>

ちゃんとnewできました!初心者は、こんなのでも時間をロスしてしまいます。

参考

StackOverflow
予約後一覧

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5