AnApprentice
AnApprentice

Reputation: 110960

Devise Invitable : Optionally Send Email

in devise invitable, you can invite a new user by performing:

User.invite!(:email => "[email protected]", :name => "John Doe")

What I would like to do is (sometimes) prevent devise invitable from sending out an email. I found the following code in the library:

def invite!
        if new_record? || invited?
          self.skip_confirmation! if self.new_record? && self.respond_to?(:skip_confirmation!)
          generate_invitation_token if self.invitation_token.nil?
          self.invitation_sent_at = Time.now.utc
          save(:validate => false)
          ::Devise.mailer.invitation_instructions(self).deliver
        end
      end

Any ideas on how to best update that to not send out the email on the last line? I'm not familiar with the ::

thanks

Upvotes: 5

Views: 5135

Answers (2)

ian root
ian root

Reputation: 349

In your invitations_controller (there should already be one that inherits from Devise::InvitationsController), you can add the following

  # this is called when creating invitation
  # should return an instance of resource class
  def invite_resource
    if new_record? || invited?
      self.skip_confirmation! if self.new_record? && self.respond_to?(:skip_confirmation!)
      super
    end
  end

This will override Devise's method for inviting, and then call the original Devise method (super) only if the condition is met. Devise should then handle the token generation and send the invite. You may also want to setup what the app does if the condition is false, in my case that looks like this:

  def invite_resource
    if user_params[:is_free] == "true"
      super
    else
      # skip sending emails on invite
      super { |user| user.skip_invitation = true }
    end
  end

when params[:is_free] is set to ''true'' the invitation is sent, otherwise the resource is created, but no invitation is sent.

After some digging I found this solution here: https://github-wiki-see.page/m/thuy-econsys/rails_app/wiki/customize-DeviseInvitable

Upvotes: 0

Mateusz
Mateusz

Reputation: 1197

you can use:

User.invite!(:email => "[email protected]", :name => "John Doe") do |u|
  u.skip_invitation = true
end

or

User.invite!(:email => "[email protected]", :name => "John Doe", :skip_invitation => true)

this will skip invitation email.

Upvotes: 12

Related Questions