如何通过devise_invitable邀请现有用户

时间:2013-03-18 06:04:05

标签: ruby-on-rails ruby devise devise-invitable

我实施了

gem 'devise_invitable' 

对于模型User,我在邀请现有用户时遇到问题。错误说"USER IS ALREADY REGISTERED"。我想在另一个User邀请列表中添加相同的用户。怎么办呢?

2 个答案:

答案 0 :(得分:1)

要实现此目的,您需要创建一个新的Invitations Controller,它继承自原始的Devise :: Invitations控制器,但在create方法中修改了逻辑。

gem的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 :(得分:1)

对于那些寻找同一问题的不同实现的人,您可以将新行为添加到InvitationsController受保护的方法invite_resource

以下示例的详细说明可在DeviseInvitable维基页面上找到,标题为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
相关问题