邀請現有的用戶,我實現如何通過devise_invitable
gem 'devise_invitable'
的模型User
和我面臨的一個問題,同時邀請現有用戶。錯誤說。我想在另一個User
邀請的列表中添加同一用戶。如何才能做到這一點?
邀請現有的用戶,我實現如何通過devise_invitable
gem 'devise_invitable'
的模型User
和我面臨的一個問題,同時邀請現有用戶。錯誤說。我想在另一個User
邀請的列表中添加同一用戶。如何才能做到這一點?
要完成此操作,您需要創建一個新的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
即可恢復到父控制器中的相同方法以完成操作。
對於那些正在尋找相同問題的不同實施方案,您可以將新行爲添加到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
謝謝你 - 我結束了使用這種方法重新發送邀請,因爲我得到一個'電子郵件已經存在'錯誤試圖重新發送(即使設計配置設置爲允許重新發送) – 2017-04-27 20:04:41