0
0

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 1 year has passed since last update.

【Rails】undefined method `admin?' for nil:NilClassが発生したので解決する

Posted at

エラー発生箇所

Railsチュートリアル(第7版)10章にて
現在のユーザーが管理者かどうかを確認するadmin_userメソッドを追加後Mintestを実行するとエラーが発生しました。

同じような状態になってしまった方の参考に少しでもなれば幸いです。

users_controller.rb
class UsersController < ApplicationController
.
.
.
    # 管理者かどうか確認
    def admin_user
      redirect_to(root_url, status: :see_other) unless current_user.admin?
    end
end

エラーメッセージ
NoMethodError: undefined method `admin?' for nil:NilClass

解決までの思考

Userモデルadminが追加されていないのかと思い、schema.rbの内容を確認します。

schema.rb
ActiveRecord::Schema[7.0].define(version: 2023_04_12_041409) do
  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.string "remember_digest"
    t.boolean "admin", default: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end
end

追加されていました。

Railsコンソール
>> user = User.first
>> user.admin?
=> true

Railsコンソールでadmin?メソッドが使えることも確認できます。

ということはメソッドを実行するcurrent_userに問題がありそうです。

admin_userメソッドはdestroyアクションが実行される前にbefore_actionで呼び出されるので、その時点でcurrent_userに値が入っている必要があります。

ここで同じくbefore_actionadmin_userの前に呼ばれるlogged_in_userが実行されていないのでは!と閃きました。

logged_in_userを実行するアクションを指定するonly::destoryを指定し忘れたかと思い確認すると、、

users_controller.rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :delete]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy

:destroyとすべきところを:deleteにしていました、、

:destroyに修正すると無事テストが通りました!

users_controller.rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy

分かったこと

メソッドを実行する対象(今回の場合はcurrent_user)をレシーバという。
for nil:NilClassのエラーが出た場合はレシーバがnilになっていないか疑う。

※参考記事
https://hachimaki37.hatenablog.com/entry/2020/12/15/193747
https://diveintocode.jp/blogs/beginner/nilClass

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?