注意(2023/02/09追記)
こちらのDeviseのpull requestはTurboに対応し、マージされてDevise 4.9.0がリリースされたらこの記事のパッチは不要になります。
Rails 7 + Devise + Turboを使うには
Rails 7のアプリでDeviseとTurboを使った時のパッチをいくつかのところで見かけました:
【2023年版】Turboを有効化したままRails 7.0でDeviseを使う方法
Devise Auth Setup in Rails 7
How to use Devise with Hotwire & Turbo.js Discussion
こんな感じです:
class TurboDeviseController < ApplicationController
class Responder < ActionController::Responder
def to_turbo_stream
controller.render(options.merge(formats: :html))
rescue ActionView::MissingTemplate => error
if get?
raise error
elsif has_errors? && default_action
render rendering_options.merge(formats: :html, status: :unprocessable_entity)
else
redirect_to navigation_location
end
end
end
self.responder = Responder
respond_to :html, :turbo_stream
end
僕の会社のアプリで同じコードを実装し、普通にDeviseを使っていたものの...
エラー発生
いきなりCIが落ちる...
最後のコミットはコメントを消しただけなのに...
NameError: undefined local variable or method `rendering_options' for #<TurboDeviseController::Responder:0x00007f8ec49daaf8 ...
ということでIssueを作ったら先輩も同じ問題に遭遇し、原因はrespondersというgemのv3.1.0とのこと。
ちょっと調べた結果、バグが見つかったので対処法を書いておきます。
rendering_options
の名前が変わった
rendering_options
はこちらのプルリクで追加されましたが、こちらのプルリクではそのrendering_options
がerror_rendering_options
に変わりました。それだけです!ということで、上のコードのrender
をこう書き換えたら動くはずです:
render error_rendering_options.merge(formats: :html, status: :unprocessable_entity)
以上。