【问题标题】:Using devise_invitable for adding Users to a Group in Ruby on Rails?使用 devise_invitable 将用户添加到 Ruby on Rails 中的组?
【发布时间】:2010-11-11 21:44:27
【问题描述】:

我的应用中有一个用户可以加入的“群组”资源(群组 has_and_belongs_to_many 用户,反之亦然)。 devise_invitable 插件允许我的应用程序上的现有用户通过电子邮件向另一个诗人用户发送邀请以在网站上注册,但我想要一些额外的功能:我希望用户能够邀请某人加入特定组,这样一旦他们接受电子邮件中的邀请,他们就可以看到加入该群组的链接。

有没有人用 devise_invitable 来做这样的事情?添加此额外功能的最佳方法是什么?看来我需要在邀请电子邮件中包含某种标识组的“组令牌”,然后将其传递回用户单击以接受邀请的 URL。

我应该重写邀请控制器方法,还是有其他插件可以更好地满足此目的?

【问题讨论】:

    标签: ruby-on-rails registration devise


    【解决方案1】:

    我刚刚实现了一些非常相似的。我曾尝试使用 devise_invitable,但工作量很大。所以我找了一些其他的插件,但我找不到任何东西,我得出结论,编写自己的实现更容易。 这就是我所做的:

    • 添加邀请资源,

    • 当用户创建邀请时,我会在邀请字段(它是一个序列化的哈希)中存储我需要向将接受邀请的用户应用的所有信息

    • 向受邀用户发送一封电子邮件,其中包含如下链接:/users/signup?invitation_token=1231223123

    • 当用户单击链接时,我会创建用户并应用存储在邀请中的所有信息,例如组成员身份、名称、角色...

    • 如果受邀用户不需要注册服务,而不是电子邮件中的链接不同:invitations/123/accept?invitation_token=12312312asdas324

    希望对你有所帮助

    【讨论】:

      【解决方案2】:

      我已经通过覆盖邀请控制器来完成此操作,执行此操作的说明在 github 上的 devise_invitable 主页中,因此我不会在这里进行介绍。

      为了安全起见,我创建了一个包含额外邀请信息的新表,以便电子邮件接受链接不包含群组链接(我的群组仅通过私人邀请进行,因此我不希望受邀用户更改邀请 url在电子邮件中,并可能添加其他未受邀的组)。

      devise_invitable 在用户表中创建新表后,通过用户 id 对新表进行索引。

      class Users::InvitesController < Devise::InvitationsController
      .
      .
      def create
      
          # make sure the current user is connected to this object for security
          if @object.has_connection_with(current_user)
      
            # perform the invite    
            self.resource = resource_class.invite!(params[resource_name], current_inviter)
      
            #since we invite based on object, we must reference this object once the user accepts, so we store this in our Invites table
            object_invite = Invite.new(:invitable_type => @object.class.name, :invitable_id => @object.id, :user_id => self.resource.id, :inviter_id => current_inviter.profile.id)
            object_invite.save!
      
            if resource.errors.empty?
              set_flash_message :notice, :send_instructions, :email => self.resource.email
              #respond_with resource, :location => after_invite_path_for(resource)
              render :json => {:status => 'success'} and return
            else
              respond_with_navigational(resource) { render_with_scope :new }
            end
          end
        end
      

      然后在您的更新方法中(同样在同一个控制器中)您可以找到()邀请记录并提取允许您将新用户连接到组的所需信息。

      剩下的唯一问题是如何向电子邮件添加其他参数,例如组名,我还没有解决。

      【讨论】:

        猜你喜欢
        • 2012-06-19
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多