5

我在我的 rails 应用程序上安装了 devise_invitable。创建新邀请可以正常工作。

我构建了一个视图来管理邀请列表,并创建了一个表单按钮以允许管理员删除未完成的邀请。这是代码:

<%= link_to "Cancel Invitation", remove_user_invitation_path(invitation_token: invited.invitation_token), confirm: "Are you sure?", class: 'btn btn-mini btn-danger' %>

结果始终是错误“提供的邀请令牌无效!”

查看服务器日志,我看到如下内容:

Started GET "/invitation/remove?invitation_token=f4e26062f27c7cc32a60e2024b9dba2b1350abba" for 127.0.0.1 at 2013-10-28 15:07:44 -0700
Processing by Devise::InvitationsController#destroy as HTML
Parameters: {"invitation_token"=>"f4e26062f27c7cc32a60e2024b9dba2b1350abba"}
User Load (2.9ms)  SELECT "users".* FROM "users" WHERE "users"."invitation_token" = '46488d68fb36387ec639d5d6b9749273b56561a944f76eeefb2f5294ea5225e6' LIMIT 1

这表明删除方法不需要原始邀请令牌。(我可以从安全的角度理解这一点。)

我应该将什么值传递给 remove_user_invitation_path?

4

2 回答 2

5

我目前正在构建完全相同的东西,并遇到了同样的问题。

我发现当 Devise-Invitable 接受链接令牌实际上是“原始”令牌的加密版本时。原始令牌没有持久化 - 它是(受邀的)用户对象上的一个实例变量。(参见 lib/devise_invitable/model.rb 中的 generate_invitation_token() )

由于您已经在列表页面上,因此原始用户对象早已不复存在,您所剩下的只是保留的内容。

我看到了一些解决方法 - 在邀请用户时保留 raw_invitation_token 。(您可以通过向您的用户添加另一列并覆盖相关的邀请()方法来做到这一点。多次保存或诱人的猴子补丁很快就会变得令人讨厌。)

在我意识到即使你让它工作之前,我开始沿着路线走大约 90% 的路,标准删除端点实际上希望用户没有登录,这迫使我重新思考为什么我需要重用反正路线?

所以我目前的解决方案涉及一个新的端点,它 1) 使用除 User.find_by_invitation_token() 之外的不同查找器方法(它解密令牌),并且不检查您是否已注销:-)

例如。

class InvitationsController < ApplicationController
  ...

  before_filter :user_from_invitation_token

  def remove
    User.destroy(@user.id)
    flash[:notice] = 'Invitation removed'
    redirect_to company_users_path
  end

  private

  def user_from_invitation_token
    unless params[:invitation_token] && @user = @company.invited_users.where(invitation_token: params[:invitation_token]).first
      flash[:error] = 'Invitation not found'
      redirect_to company_users_path
    end
  end
  ...

这是一个 WIP,我对解决方案不是 100% 满意 - 但是,如果您正在构建一个用于管理邀请的 UI,那么您将超越 Devise-invitable 提供的开箱即用的功能。

于 2013-11-02T13:04:07.520 回答
0

我正在构建一个邀请管理系统,并想知道是否有更新的解决方案来删除/删除使用 devise_invitable 发送的邀请。

于 2014-12-18T17:23:26.767 回答