Where should warden callbacks be placed in a rails app?

Adrian Macneil picture Adrian Macneil · Sep 11, 2011 · Viewed 7.4k times · Source

I'm relatively new to rails. I have Devise set up, and want to run some callback code after users sign in.

Looking at the Warden wiki page, I can use the "after_set_user" callback to perform this logic, for example:

Warden::Manager.after_set_user do |user, auth, opts|
  unless user.active?
    auth.logout
    throw(:warden, :message => "User not active")
  end
end

However, I'm not sure where I should be storing this stuff. My first thought is that I could put it in config/initializers/devise.rb. Is that correct? It doesn't feel right putting what is essentially controller code in the config directory.

Answer

José Valim picture José Valim · Dec 2, 2011

Warden hooks need to be required when your application is booting, so inside Devise's initializer at config/initializers/devise.rb is a good candidate.

However, the behavior you want to achieve will be better accomplished by using this Devise feature:

https://github.com/plataformatec/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in