devise_invitable: How to create a guest only after user confirmation by email
I'm trying to create members of a team by using devise_invitable. But by looking the video related to devise_invitable, I'm not sure if I can create team members ONLY AFTER user confirmation by email. Any ideas?
Thank you
Hey rodolfo,
What problem are you trying to solve by creating the member only after the confirmation?
Hi @Jacob, thank you for your answer. I have 3 models: user, team and member. I'm trying to create a member by using devise_invited, but watching the devise_invited tutorial my app is currently creating a member of a team even if the invited user has not accepted the invitation by email. I wont to create a member only after the confirmation. Otherwise I will have members that do not exist as user. Here a fragment of the code:
Rails.application.routes.draw do
resources :teams do
resources :members
end
devise_for :users
root to: 'teams#index'
end
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatables
has_many :own_teams, class_name: 'Team', foreign_key: :user_id
has_many :members
has_many :teams, through: :members
end
class Team < ApplicationRecord
belongs_to :user
has_many :members
has_many :users, through: :members
end
class Member < ApplicationRecord
belongs_to :user
belongs_to :team
attribute :email, :string
before_validation :set_user_id, if: :email?
def set_user_id
self.user = User.invite!(email: email)
end
end
class MembersController < ApplicationController
before_action :authenticate_user!
before_action :set_team
def create
member = @team.members.new(member_params)
member.team = @team
if member.save
redirect_to @team, success: 'Bien hecho'
else
redirect_to @team, alert: 'Mal hecho'
end
end
private
def set_team
@team = current_user.own_teams.find(params[:team_id])
end
def member_params
params.require(:member).permit(:email)
end
end
Ok I see, you could put a status field on the member object so you can filter out members who haven't accepted their invitation and then change the status once the user has accepted the invite. This would allow you to periodically delete invitations that are over X days old so you don't end up with a bunch of abandoned records.
Another option would be to store the team ID on the invited user object so once the user accepts their invitation, you then create the member object since that really only functions as a join table between the user object and the team object.