我实施了
gem 'devise_invitable'
对于模型User
,我在邀请现有用户时遇到问题。错误说"USER IS ALREADY REGISTERED"
。我想在另一个User
邀请列表中添加相同的用户。如何才能做到这一点?
我实施了
gem 'devise_invitable'
对于模型User
,我在邀请现有用户时遇到问题。错误说"USER IS ALREADY REGISTERED"
。我想在另一个User
邀请列表中添加相同的用户。如何才能做到这一点?
对于那些寻找相同问题的不同实现的人,您可以将新行为添加到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
为此,您需要创建一个新的 Invitations 控制器,该控制器继承自原始的 Devise::Invitations 控制器,但修改了 create 方法中的逻辑。
gem 的README中有一个关于“配置控制器”的部分描述了这个过程。我还建议查看父控制器的源代码,因为它有助于提供一些上下文。
我做了一些与您想要的类似的事情,并使用了 Rails 的内置方法find_by_email
。这是我使用的一些代码...
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
以恢复到父控制器中的相同方法以完成操作。