【エラー】「Error: Undefined method `authenticates_with_sorcery!' for User:Class」の対処法

はじめに

遭遇したエラーについて

sorceryを導入しようとしたときに遭遇したエラー

公式のwiki通りにGemfileに'sorcery'と記載して下記コマンドを実行。

$ rails g sorcery:install
$ rails db:migrate

その際にこんなエラーに遭遇。

Error: Undefined method `authenticates_with_sorcery!' for User:Class

まあ簡単に訳すと Userクラスに対して`authenticates_with_sorcery!'なんてメソッドは 定義されてないので使えませんよー! みたいな感じです!笑

`authenticates_with_sorcery!'とはなんぞやって話なんですけど、 sorceryをインストールするとUserモデルやマイグレーションファイルが生成されます。

その際に、Userモデルに先程の`authenticates_with_sorcery!'メソッドが定義されます。

class User < ApplicationRecord
  authenticates_with_sorcery!
end

このメソッドをUserモデルに定義することで、 認証機能などのsorceryの機能がもろもろ使えるようになります。

なので、sorceryをインストールした時点で勝手に定義されるので、こんなエラーが出るのがおかしいわけなんです笑

そこでuser.rbを確認してみたものの、やはりしっかりと定義されていたんです!

あれ?っとなるわけです。

そこで生成されたマイグレーションファイルを確認してみたところ、、、

class SorceryCore < ActiveRecord::Migration[5.2]
  def change
    create_table :User do |t|
      t.string :email,            null: false
      t.string :crypted_password
      t.string :salt
      t.timestamps                null: false
    end
    add_index :User, :email, unique: true
  end
end

create_tableのところが「User」になっていたわけです。

通常、generateコマンドでUserモデルを作成すると こんな感じのマイグレーションファイルになると思います。

$ rails g model User name:string email:string
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

Userテーブルではなく、usersテーブルが作成されるはずなんです。

つまり今回のエラーの原因はここです。

なので、先程のマイグレーションファイルの 「User」のところを「users」に変えてあげれば、

class SorceryCore < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :email,            null: false
      t.string :crypted_password
      t.string :salt
      t.timestamps                null: false
    end
    add_index :users, :email, unique: true
  end
end
$ rails db:migrate

問題なくマイグレートできます!

※間違いなどあればコメントください!