7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-20

#事象
rails consoleから単純にnewしたら以下のエラーが表示される。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?