我在我的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
这表明delete方法不期望原始的邀请令牌。 (从安全角度来看,我可以理解这一点。)
我应该将什么值传递给remove_user_invitation_path?
答案 0 :(得分:3)
我现在正在构建完全相同的东西,并遇到了同样的问题。
我发现当Devise-Invitable接受链接令牌实际上是'原始'令牌的加密版本时。原始令牌不会持久化 - 它是(受邀)用户对象上的实例变量。 (参见lib / devise_invitable / model.rb中的generate_invitation_token())
由于您已经在列表页面上,原始用户对象早已不复存在,您剩下的就是持久存在的内容。
我看到了一些方法 - 在邀请用户时保留raw_invitation_token。 (您可以通过向用户添加另一列并覆盖相关的invite()方法来实现此目的。通过多次保存或诱人的猴子补丁,这会很快变得令人讨厌。)
我开始下行并获得了大约90%的路径,然后才意识到即使你让它工作,标准的删除端点实际上也希望用户不能登录,这迫使我重新思考为什么我需要无论如何重用那条路线?
所以我当前的解决方案涉及一个新的端点,1)除了User.find_by_invitation_token()之外使用不同的finder方法(它解密令牌),并且没有检查你是否已经注销: - )
例如
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,我对解决方案并不是百分之百满意 - 但是,如果您正在构建用于管理邀请的UI,那么您将超越Devise-invitable提供的开箱即用的功能。
答案 1 :(得分:0)
我正在建立一个邀请管理系统,如果有一个更新的解决方案来删除/删除使用devise_invitable发送的邀请,我很好奇。