5

我有一个带有 Clearance 和 Pundit 的 Rails 应用程序,我正在尝试创建“团队”,其中“团队负责人”可以邀请其他用户加入他们的团队。我想做一些类似于devise_invitable的事情,但要使用 Clearance。

这是我的计划:

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

  2. 团队 ID 或名称将是唯一的,每个用户只能属于一个团队。关联看起来像这样:

    团队

    has_many :users
    

    用户

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

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

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

4

1 回答 1

6

你的计划很好。没有许可权威人士特定的方法来做到这一点。当然,您的策略看起来不错,您必须使用Clearance来实施它。

  1. 据我了解,您首先要创建用户,然后为用户创建团队。所以最好after_*从可用的回调中进行用户回调before_filter在记录存储到数据库之前执行钩子。例如,除非您将用户存储在数据库中,否则您不能在保存用户“之前”将其分配为团队负责人。

  2. 如果您想使用 UUID 而不是 ID,您可以执行类似的操作否则您可以简单地对表的列使用唯一约束。你提到的协会似乎很好。nameteams

  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

于 2018-05-27T18:25:01.123 回答