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?
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.