我有一个带有Clearance和Pundit的Rails应用程序,我正在尝试创建“团队”,“团队负责人”可以邀请其他用户加入他们的团队。我想something similar到devise_invitable,但是有了Clearance。
以下是我如何运作的计划:
通过注册表单注册该站点的用户将自动分配一个唯一的团队ID,并成为“团队负责人”。他们在表单上看不到此ID。 (可以这样做的另一种方法是创建一个在注册时保存的唯一团队名称。)最好的方法是创建一个before_filter,以便在注册时分配团队ID和团队负责人吗?
团队ID或名称将是唯一的,每个用户只能属于一个团队。协会看起来像这样:
团队
has_many :users
用户
belongs_to :team
创建此“团队负责人”帐户后,此用户可以通过填写类似于清除注册表单(姓名,电子邮件等)的用户#新表单,邀请其他用户加入团队。表单将创建用户并将其分配给团队负责人的团队。可以为他们分配一个随机密码以提供给Clearance,以便新用户通过验证。
一旦用户由团队负责人创建,他们将使用随机生成的密码保存在数据库中,并将Mailer发送给与标准清除密码重置邮件程序类似的受邀用户。它只是给了他们一个通知,他们已被邀请加入团队,并提供一个重置密码然后登录的链接。它基本上是清除密码重置梅勒与不同的副本。
这是一个不错的策略,还是我用Clearance和Pundit来解决这个问题时缺少一种更广泛使用的模式?我从来没有用Rails做过这样的事情,所以我不知道这是否是一种使用Clearance的管道式磁带方式。
答案 0 :(得分:5)
你的计划很好。没有Clearance或Pundit具体方法可以执行此操作。当然,您的策略似乎很好,您必须使用Clearance实现它。
据我了解,您首先要创建用户,然后为用户创建团队。因此,最好从可用的callbacks用户after_*
回调。在将记录存储在数据库中之前执行before_filter
挂钩。因此,例如,除非您将用户存储在数据库中,否则您无法将其分配为团队负责人"之前"用户已保存。
如果您想使用UUID而不是ID,则可以执行this之类的操作,否则您只需使用name
teams
列上的app/controllers/team_members#create
即可表。您提到的协会似乎很好。
您可以在此处创建自定义控制器以创建用户。像def create
member = User.new(team_member_params)
if member.save
#some code
else
#some code
end
end
这样的东西。我认为不需要将导管带到unique constraint。示例代码可以是:
after_create
after_create :send_invitation_to_team_member, if: :not_team_leader
hook发送新的邮件。 public String hashToHexString(String whatever) throws NoSuchAlgorithmException{
byte[] digest = MessageDigest.getInstance("your one way hash alghoritm")
.digest(whatever.getBytes());
return DatatypeConverter.printHexBinary(digest);
}