2013-03-18 79 views
2

邀請現有的用戶,我實現如何通過devise_invitable

gem 'devise_invitable' 

的模型User和我面臨的一個問題,同時邀請現有用戶。錯誤說。我想在另一個User邀請的列表中添加同一用戶。如何才能做到這一點?

回答

1

要完成此操作,您需要創建一個新的Invitations控制器,該控制器從原始的Devise :: Invitations控制器繼承,但已在create方法中修改了邏輯。

創業板的README有一個關於「配置控制器」的部分,它描述了這個過程。我也建議看看source code for the parent controller,因爲它有助於提供一些背景。

我做了類似於你想要的東西,並且使用了find_by_email的Rails內置方法。下面是一些我使用的代碼的...

def create 
    # new user 
    if User.find_by_email(invite_params[:email]).nil? 
     super 
    # existing user 
    else 
     @u = User.find_by_email!(invite_params[:email]) 
    ....more code that does what you want.... 
    end 
    end 

注:Rails是一個聰明,如果沒有衝突的指令給你創建子控制器將使用邏輯從父控制器。關鍵是你不需要重寫整個控制器。理想情況下,您只需在子控制器中進行修改,然後調用super即可恢復到父控制器中的相同方法以完成操作。

1

對於那些正在尋找相同問題的不同實施方案,您可以將新行爲添加到InvitationsController受保護的方法invite_resource

以下示例的更詳細的解釋可在DeviseInvitable wiki頁面上找到,標題爲Invite a Resource (or User) that Has Already Signed Up without Invitation

class Users::InvitationsController < Devise::InvitationsController 

    protected 

    # invite_resource is called when creating invitation 
    # should return an instance of resource class 

    # this is devise_invitable's implementation 
    # def invite_resource(&block) 
    # resource_class.invite!(invite_params, current_inviter, &block) 
    # end 

    def invite_resource(&block) 
    @user = User.find_by(email: invite_params[:email]) 
    # @user is an instance or nil 
    if @user && @user.email != current_user.email 
     # invite! instance method returns a Mail::Message instance 
     @user.invite!(current_user) 
     # return the user instance to match expected return type 
     @user 
    else 
     # invite! class method returns invitable var, which is a User instance 
     resource_class.invite!(invite_params, current_inviter, &block) 
    end 
    end 
end 
+0

謝謝你 - 我結束了使用這種方法重新發送邀請,因爲我得到一個'電子郵件已經存在'錯誤試圖重新發送(即使設計配置設置爲允許重新發送) – 2017-04-27 20:04:41