您如何通过 Clearance and Pundit 邀请其他用户加入 "team" 或 "account" 或 "project"?

How do you invite another user to a "team" or "account" or "project" with Clearance and Pundit?

我有一个带有 Clearance 和 Pundit 的 Rails 应用程序,我正在尝试创建 "teams","Team Leader" 可以在其中邀请其他用户加入他们的团队。我想做 something similar to devise_invitable,但需要清关。

这是我的计划:

  1. 通过注册表单注册站点的用户会自动分配一个唯一的团队 ID,并成为 "Team Lead." 他们在表单上看不到此 ID。 (另一种方法是他们创建一个唯一的团队名称,该名称在注册时保存。)最好的方法是创建一个 before_filter 来分配团队 ID 和团队负责人注册时?

  2. 团队 ID 或名称将是唯一的,每个用户只能属于一个团队。关联将如下所示:

    团队

    has_many :users
    

    用户

    belongs_to :team
    
  3. 创建此 "Team Leader" 帐户后,此用户可以通过填写类似于 Clearance 注册表单(姓名、电子邮件)的用户#new 表单来邀请其他用户加入团队等)此表单将创建用户并将他们分配给团队负责人的团队。可以为他们分配一个随机密码以提供给 Clearance,以便新用户通过验证。

  4. 团队负责人创建用户后,他们将使用随机生成的密码保存在数据库中,并且会向受邀用户发送类似于标准清除密码重置邮件的邮件.它只是给他们一个通知,告诉他们他们已被邀请加入团队,并提供一个 link 来重置他们的密码然后登录。它基本上是不同副本的清除密码重置邮件。

这是一个不错的策略还是我缺少使用 ClearancePundit 解决此问题的更广泛使用的模式?我从来没有用 Rails 做过这样的事情,所以我不知道这是否是使用 Clearance.

的管道胶带方式

你的计划很好。没有Clearance or Pundit specific way to do it. Of course, your strategy seems fine and you will have to implement it using Clearance.

  1. 据我了解,您首先要创建用户,然后为用户创建团队。因此,用户 after_* 从可用的 callbacks 回调会更好。 before_filter hook 在记录存储到数据库之前执行。因此,例如,除非您将用户存储在数据库中,否则您不能将其分配为团队负责人 "before" 用户已保存。

  2. 如果您想使用 UUID 而不是 ID,您可以在 teams table 的 name 列上执行类似 this or else you can simply use the unique constraint 的操作。你提到的协会似乎很好。

  3. 您可以在此处创建自定义控制器来创建用户。类似于 app/controllers/team_members#create。我不认为它需要被输送到 Clearance。示例代码可以是:

def create
  member = User.new(team_member_params)
  if member.save
    #some code
  else
    #some code
  end
end
  1. 我认为使用密码重置电子邮件不是个好主意。您可以使用 after_create 挂钩发送新邮件。

after_create :send_invitation_to_team_member, if: :not_team_leader