开发者

Devise Invitable : Optionally Send Email

开发者 https://www.devze.com 2023-02-02 05:23 出处:网络
in devise invitable, you can invite a new user by performing: User.invite!(:email => \"new_user@example.com\", :name => \"John Doe\")

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

User.invite!(:email => "new_user@example.com", :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 =开发者_如何学C> 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


you can use:

User.invite!(:email => "new_user@example.com", :name => "John Doe") do |u|
  u.skip_invitation = true
end

or

User.invite!(:email => "new_user@example.com", :name => "John Doe", :skip_invitation => true)

this will skip invitation email.


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

0

精彩评论

暂无评论...
验证码 换一张
取 消