Last active
September 9, 2022 06:00
-
-
Save hopsoft/9c84c354e354c16898a44625df094347 to your computer and use it in GitHub Desktop.
Render views outside of the standard request context (i.e. ActiveJob) with Devise/Warden
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ExampleJob < ApplicationJob | |
queue_as :default | |
def perform(user) | |
# do some work | |
# HACK: get around limitations in devise/warden when rendering | |
# views outside the context of a formal http request | |
renderer = ::ApplicationController.renderer.new | |
renderer_env = renderer.instance_eval { @env } | |
warden = ::Warden::Proxy.new(renderer_env, ::Warden::Manager.new(Rails.application)) | |
renderer_env["warden"] = warden | |
html = renderer.render(partial: "path/to/partial") | |
ActionCable.server.broadcast "user-#{user.id}", message_type: "example", html: html | |
end | |
end |
Epic, saved us a lot of time! Thank you.
We setup a module in lib/modules/view_renderer.rb
class ViewRenderer
def self.renderer
renderer = ::ApplicationController.renderer.new
renderer_env = renderer.instance_eval { @env }
warden = ::Warden::Proxy.new(renderer_env, ::Warden::Manager.new(Rails.application))
renderer_env["warden"] = warden
return renderer
end
end
Whenever we need to use the renderer we just use ViewRenderer.renderer
Thanks for sharing! Worked flawlessly
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Good hack! Spent a few days looking for the problem and a solution.
I used your code in the parent class like so:
This allows for a standard render call in the job:
Hopefully, this will help others as well until there's an official way of doing this within rails or the Devise gem.
Thanks!