【问题标题】:How to invite an existing user through devise_invitable如何通过 devise_invitable 邀请现有用户
【发布时间】:2013-03-18 06:04:05
【问题描述】:

我实现了

gem 'devise_invitable' 

对于模型User,我在邀请现有用户时遇到问题。错误显示"USER IS ALREADY REGISTERED"。我想在另一个User 邀请列表中添加相同的用户。如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

    可以在标题为 Invite a Resource (or User) that Has Already Signed Up without InvitationDeviseInvitable wiki 页面上找到对以下示例的更详细说明。

    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
    

    【讨论】:

    • 谢谢 - 我最终使用此方法重新发送邀请,因为我在尝试重新发送时收到“电子邮件已存在”错误(即使设计配置设置为允许重新发送)
    【解决方案2】:

    为此,您需要创建一个新的 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 很智能,如果您创建的子控制器没有给出冲突的指令,Rails 将使用父控制器的逻辑。关键是您不需要重新编写整个控制器。理想情况下,您只需在子控制器中进行修改,然后调用 super 以恢复到父控制器中的相同方法以完成操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多