Jeremy Ramos Jeremy Ramos - 20 days ago 5
Ruby Question

Using devise invitable. How to create the user only after the user has set his password

def create
if User.invite!(user_params)
flash[:success] = t('flashes.users.create_success')
else
flash[:error] = t('flashes.users.create_error')
end
redirect_to company_path(id: company.slug)
end


User.invite!
will create the user, then send an invitation to set a password. I only want it to send an invitation to set the password and then only persist the user if the user has set a password.

Answer

I would not mess with the devise invitable implementation like that.

Rather perhaps add a status column to the user using enums, so that you can isolate the users that have not accepted their invites and as one of the commenters said remove stale users later.

enum status: {invited: 0, accepted: 1}

then you can do the following:

User.invite!(status: "invited")

you will have to set the "accepted" status when the user accepts by hooking into the callbacks the gem provides (see https://github.com/scambra/devise_invitable).