SimonB666
SimonB666

Reputation: 31

Don't receive callback with devise_invitable

I'm using devise_invitable to allow users to invite each other. I want to set values for the user when the invite is created or when it's accepted. One approach is here

Using devise_invitable for adding Users to a Group in Ruby on Rails?

but this seems overkill. The callbacks look like a perfect solution, but they don't seem to fire during my Rspec tests.

Here is the user model:

class User < ActiveRecord::Base
  belongs_to :company

  rolify
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :invitable, :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :role_ids, :as => :admin
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :company
  validates :company, :presence => true

  after_invitation_accepted :email_invited_by
  before_invitation_accepted :email_invited_by

  private

    def email_invited_by
      # This is NEVER executed during tests, even when an invite is successfully accepted
       puts "Callback worked"
    end

end

Any clues about where to look would be appreciated. I find the devise_invitable documentation a bit opaque.

Thanks!

Upvotes: 2

Views: 795

Answers (2)

Justin Ho Tuan Duong
Justin Ho Tuan Duong

Reputation: 606

For those still looking for an answer here is what worked for me.

The issue is not with validations since in devise_invitable there is a config to validate on invite and it defaults to false:

# Flag that force a record to be valid before being actually invited
# Default: false
# config.validate_on_invite = true

So my solution is to use the callback provided by devise_invitable:

after_invitation_accepted :create_profile

Do note that this needs to be below devise :invitable

Upvotes: 1

Ahmad Sherif
Ahmad Sherif

Reputation: 6223

devise_invitable callbacks will be fired if the user has been really invited (i.e. the object is persisted and there's an invitation token set) and the object (user's object) has no validation errors. That said, I see that you're validating presence of company without any conditions, which, I think, could be causing validation errors.

If that's the case, you can add a condition like this

validates :company, :presence => true, :if => Proc.new { self.invitation_token.nil? }

so it won't cause validation errors and fire the callbacks.

Upvotes: 0

Related Questions