#事象
rails consoleから単純に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
予約後一覧