3

I followed these instructions to check whether a user has been soft-deleted or not when logging in. In the example below I can check for a boolean value:

Class User < ActiveRecord::Base
  def self.find_for_authentication(conditions)
    super(conditions.merge(:deleted_flag => false))
  end

I would prefer a timestamp (created_at) field. How can I check whether such a field is empty? The database throws errors for the following checks:

super(conditions.merge(:deleted_at => false)) # also tried nil, "NULL" and "IS NULL"
Community
  • 1
  • 1
migu
  • 4,236
  • 5
  • 39
  • 60

1 Answers1

11

You can't using this solution, without modifying devise of course. Devise will send your conditions directly to the database, so no way of calling a method or using a library like squeel (that will allow something like where{created_at == nil}.

You could use the solution provided in How to "soft delete" user with Devise, but the error message will be: "You have to confirm your account before continuing."

Add this to your resource model:

  def inactive_message
    !!deleted_at ? :deleted : super
  end

And add a message to your locales:

en:
  devise:
    failure:
      deleted: "Your account was deleted."

I hope it helps!

Community
  • 1
  • 1
Leonel Galán
  • 6,993
  • 2
  • 41
  • 60