我的应用中有一个“群组”资源,用户可以加入(群组has_and_belongs_to_many用户,反之亦然)。 devise_invitable插件允许我的应用程序上的现有用户通过电子邮件向另一个诗歌用户发送邀请以在网站上注册,但我想要一些额外的功能:我希望用户能够邀请某人加入特定的群组,以便他们在电子邮件中接受该邀请后,就会看到加入该群组的链接。
有没有人用devise_invitable来做这样的事情?添加此额外功能的最佳方法是什么?我似乎需要在邀请电子邮件中包含某种标识该组的“组令牌”,然后将其传回用户点击以接受邀请的网址。
我是否应该覆盖邀请控制器方法,还是有其他插件可以更好地满足目的?
答案 0 :(得分:7)
我刚刚实施了一些非常相似的。我曾试图使用devise_invitable,但它的工作量很大。所以我找了一些其他的插件,但我找不到任何东西,我总结说编写我自己的实现更容易。 这就是我所做的:
添加邀请资源
当用户创建邀请时,我存储在邀请字段中(它是序列化哈希)我需要应用于接受邀请的用户的所有信息
电子邮件发送给受邀用户,其中包含以下链接:/ users / signup?invitation_token = 1231223123
当用户点击链接时,我创建用户并应用邀请中存储的所有信息,如组成员资格,名称,角色...
如果受邀用户不需要注册该服务,则电子邮件中的链接不同:invitations / 123 / accept?invitation_token = 12312312asdas324
希望这个帮助
答案 1 :(得分:6)
我通过覆盖invites控制器完成了这个,执行此操作的指令位于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
然后在您的更新方法中(再次在同一个控制器中),您可以找到()邀请记录并提取所需的信息,以便您将新用户连接到该组。
剩下的唯一问题是如何在电子邮件中添加其他参数,例如我尚未解决的群组名称。