OmniAuth + Devise 連携で ActionView::Template::Error (undefined method `omniauth_authorize_path’ for x

事象

ただの「テンプレのエラー」という見方をすれば、それまでだが、こういったよく連携するモジュール側の互換性がなくなるパータンって、なんか逆にフレームワーク使って初学者が無駄な時間を消費するパータンのようにも思えたのでメモしました。まぁ、Ruby On Rails 本体じゃないのでフレームワークのせいではないですけどね。

OmniAuth+Devise_NoMethodError

OmniAuth+Devise_NoMethodError

原因

OmniAuth のメソッド変更に Devise のテンプレートが追い付いていないため発生していて、以前は omniauth_authorize_path() だったのが、現在は __omniauth_authorize_path() のようになっており、例えば、admin_twitter_omniauth_authorize_path() とか user_facebook_omniauth_authorize_path() のように呼び出すように変更された様です。
そのため、この例では 24 行目の provider の呼び出しのところで omniauth_authorize_path() を呼び出しているので NoMethodError となっています。

対応策

<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %>

となっている箇所を以下のように変更することで正常に表示されます。
<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", public_send("#{resource_class.name.downcase}_#{provider.to_s}_omniauth_authorize_path") %>

参考

[*Rails*] deviseの使い方(rails5版) by cigalecigales さん

スポンサーリンク