Ruby
Rails
devise

deviseでundefined method `failure_app' for nil:NilClass

背景

deviseによる認可の庇護下にrackアプリをmountしたい場合において発生。
こんなやつ。

Rails.application.routes.draw do
  root 'home#index'

  namespace :admin do
    devise_for :admins
    authenticate :admin do
      mount Sidekiq::Web => '/sidekiq'
    end
  end
end

authenticate ブロック内ではdeviseの認可を通っているか評価してくれるのでsidekiqのほかにもpgherookuribito_railsのようなgemを使う場合には便利。

遭遇したエラー

上記 authenticate メソッドを使いdeviseの庇護下においたrackアプリ(この例で言えば /admin/sidekiq )へアクセスした際に遭遇。

undefined method `failure_app' for nil:NilClass

解決策

authenticate メソッドの引数に渡している値に誤りがあった。

Rails.application.routes.draw do
  root 'home#index'

  namespace :admin do
    devise_for :admins
    # authenticate :admin do
    authenticate :admin_admin do # <- NEW
      mount Sidekiq::Web => '/sidekiq'
    end
  end
end

てっきりdeviseを入れたmodel名.underscoreで良いかと思っていたけれどどうやら devise_for を呼んでいるスコープのネームスペース名も含まれてくるっぽい?

具体的にはこのあたりを見てみて、pryなり使って実際に Devise.mappings にどのような値が入っているか確認してみるのが早い。どのようにdeviseがマッピングしているのか興味ないのでこれ以上追跡はしていない。

おまけ

局所的な問題に対しての解なので投稿するにはかなり微妙な内容だと思ったけど個人的にヘイト値が高くなりがちなgemなのでこういったくだらない問題に頭を悩まされたくないという思いがある。もし同じ問題に遭遇して困っている人がいるならこの記事を読んで秒殺してくれれば報われるなと思い投稿するに至る。