Ruby on rails 当涉及两种模型时,如何创建身份验证(电子邮件令牌/摘要)链接?

Ruby on rails 当涉及两种模型时,如何创建身份验证(电子邮件令牌/摘要)链接?,ruby-on-rails,ruby,ruby-on-rails-4,authentication,railstutorial.org,Ruby On Rails,Ruby,Ruby On Rails 4,Authentication,Railstutorial.org,我一直在关注railstutorial.org。在本教程中,我们a.o.将学习如何创建令牌/摘要以及用于帐户激活的邮件程序。它将摘要保存到db,并发送一封带有包含令牌+电子邮件地址的链接的电子邮件。然后,身份验证控制器方法根据数据库中的摘要检查电子邮件令牌组合 现在我有一个类似的情况,但有一个复杂的因素:有用户和组织。我的用例是组织可以邀请用户成为该组织的成员。在用户实际成为该组织的成员之前,用户需要使用身份验证链接确认这一点 下面是我当前的设置,包括保存到用户表中的摘要,以及与用户电子邮件地址

我一直在关注railstutorial.org。在本教程中,我们a.o.将学习如何创建令牌/摘要以及用于帐户激活的邮件程序。它将摘要保存到db,并发送一封带有包含令牌+电子邮件地址的链接的电子邮件。然后,身份验证控制器方法根据数据库中的摘要检查电子邮件令牌组合

现在我有一个类似的情况,但有一个复杂的因素:有
用户
组织
。我的用例是组织可以邀请用户成为该组织的成员。在用户实际成为该组织的成员之前,用户需要使用身份验证链接确认这一点

下面是我当前的设置,包括保存到
用户
表中的摘要,以及与用户电子邮件地址和令牌的链接。问题是,如果用户单击身份验证链接,身份验证方法仍然不知道应该将用户添加到哪个组织。它只有一个电子邮件地址和令牌

我如何才能知道是哪个组织发出了邀请?此外,我们当然不希望用户能够以这样的方式操纵链接,即用户可以将自己添加到与邀请用户的组织不同的组织中


控制器方法:

def request
  @organization = current_organization
  @user = User.find(email: params[:user][:email])
  @user.send_invitation(@organization)
end
def add_user(user, organization)
  @user = user
  @organization = organization
  mail to: user.email, subject: "Please confirm"
end
模型方法:

def send_invitation(organization)
  create_invite_digest  # Uses other model method to create digest and token.
  update_columns(invite_digest: self.invite_digest)
  UserMailer.add_user(self, organization).deliver_now
end
梅勒方法:

def request
  @organization = current_organization
  @user = User.find(email: params[:user][:email])
  @user.send_invitation(@organization)
end
def add_user(user, organization)
  @user = user
  @organization = organization
  mail to: user.email, subject: "Please confirm"
end
Mailer视图:

<%= adduser_url(@user.invite_token, email: @user.email) %>
要添加用户的模型方法:需要有关要将用户添加到的组织的信息

def add_role(organization)
end

可能最简单的方法是创建一个包含令牌、用户id和组织id的邀请模型。这将帮助您跟踪引用,并允许将来的灵活性


您也可以通过这种方式添加额外的元(例如,accepted_at),并可能添加邀请仅在一定时间内有效的功能(例如,通过使用在创建的邀请)。

对于一个类似的项目,我有一个邀请模型和参与者模型(会员资格也是一个很好的名称)

邀请包含用户电子邮件、组织id和令牌。它有一个在创建邀请时创建的相关邮件程序

然后,用户将通过电子邮件接收邀请,并使用邀请的令牌作为查找参数,单击以在站点上查看邀请。邀请有机会“接受”,这实际上是创建参与者记录(用户id、组织id)的能力。用户必须为此登录,这可能是新的注册或登录。仅当邀请令牌有效(存在且尚未使用)时,才会创建参与者。我在邀请函“accepted_at”上有一个日期,用于了解其状态以及是否可以用于创建参与者。用户无需使用特定的电子邮件地址进行注册,他们只需访问邀请即可接受邀请。用户在组织中只能成为参与者一次。参与者的角色由控制器确定

这一切对我来说都很好。我还计划添加一个参与者请求模型,允许登录用户请求成为组织的参与者。然后,组织可以选择查看请求并“接受”或“拒绝”——创建参与者或拒绝请求。Datetimes将根据请求了解其状态


如果你想要更多的模型细节,我可以给你。这可能就足够了。

您是否使用Desive gem进行登录?