如何使用尚未注册的设计用户

时间:2015-06-25 14:22:12

标签: ruby ruby-on-rails-4 devise

我有一个用户模型,对于登录和注册,它的电子邮件字段被使用(所有来自设计宝石的香草)。

我希望(其他)用户能够例如将用户添加到团队中,并使用电子邮件地址作为标识符。

用户已经存在(伪@team.users.add(User.find_by(email: other_users_email)))时没问题,但我不确定如何处理用户尚不存在的情况(尚未注册) 。 当(新)用户设置新帐户时,对于上述示例,成功注册后current_user.teams应正确显示。

我不想强迫这些潜在的新用户使用系统(例如使用devise_invitable)并使用电子邮件打扰他们。

当我使用给定电子邮件的用户尚不存在时,我遵循了创建用户的路径,但是当用户实际尝试设置帐户时,它失败了(电子邮件不是唯一的)。

或者,我可以对TeamMember部分进行改造,并可选择存储电子邮件地址或对现有用户的引用。那么我需要的是在用户帐户创建后直接检查“开放”的TeamMembers(因此,TeamMembers使用给定的电子邮件)。我也可以在每次请求时这样做,但这看起来对我来说太贵了。可能存在竞争条件,但我可以忍受这种情况(并且通过cron-job检查每个现在在千分之一的差距。)

任何指针?我确信这不是那么不寻常。

2 个答案:

答案 0 :(得分:0)

我会这样做:

当用户A通过电子邮件将用户B添加到团队时,为该用户B创建对象,但设置一个标记,如auto_created_and_inactive: true

当用户B在网站上注册时,您只需在users#create中处理此问题:首先,尝试查找自动创建的记录并更新它(设置密码或其他内容;还要重置标记) )。或以其他方式继续创建新记录的通常路线。

答案 1 :(得分:0)

我不得不承认我还没有尝试@ sergio-tulentsevs方法(实现RegistrationController #create)。但要完成我在问题中草拟的内容:

User模型可以定义after_confirmation方法,该方法在...确认后调用!因此,如果我存储关于潜在用户的每个信息并引用他/她的电子邮件地址,则一旦他/她注册,我可以查询该信息,例如,完整的团队成员资格。

# app/models/user.rb
def after_confirmation
  # (pseudo-code, did not try)
  self.teams < TeamMembership.open.where(email: self.email)
end