【エラー】「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
問題なくマイグレートできます!
※間違いなどあればコメントください!