2013-10-28 36 views
2

我有devise_invitable安裝在我的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?

回答

2

我現在正在構建完全一樣的東西,並遇到同樣的問題。

我發現當Devise-Invitable接受鏈接標記實際上是'raw'標記的加密版本時。原始標記未持久 - 它是(受邀)用戶對象上的實例變量。 (請參閱lib/devise_invitable/model.rb中的generate_invitation_token())

由於您已經在列表頁面上,原始用戶對象早已不存在,並且您留下的所有內容都是持久的。

我看到了一些解決方法 - 在用戶被邀請時保留raw_invitation_token。 (你可以通過向你的用戶添加另一列並覆蓋相關的invite()方法來做到這一點,這可以通過多次保存或誘人的猴子補丁很快得到解決。)

我開始走下去,獲得了約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 
    ... 

這是一個在製品和我不是100%滿意的解決方案 - 但它是有道理的,如果你正在建設一個UI管理邀請,那麼你踩着超出了設計,invitable提供了的盒子。

0

我正在構建一個邀請管理系統,並且好奇是否有更新的解決方案來刪除/刪除使用devise_invitable發送的邀請。

相關問題