ruby-on-railsdevisewarden

Where should warden callbacks be placed in a rails app?


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.


Solution

  • 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