我正在使用Devise邀请来邀请。通常,在邀请电子邮件中会有一个链接,将被邀请者重定向到sign_in页面,有些网址是这样的
mywebsite.com/users/invitation/accept?invitation_token=J-azZ8fKtkuAyp2VZWQX
此网址来自invitation_instructions.html:
<p><%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @token) %></p>
现在我想将控制器中的邀请网址作为json响应返回,如下所示:
def invite
invitee = User.invite!({:email => email}, current_user)
accept_invitation_url = ....
render :json => accept_invitation_url
end
知道如何在控制器中获取accept_invitation_url吗?谢谢!
答案 0 :(得分:4)
尝试在控制器中包含url helpers模块:
class MyController < ApplicationController
include DeviseInvitable::Controllers::UrlHelpers
def invite
invitee = User.invite!({:email => email}, current_user)
render :json => accept_invitation_url(invitee, :invitation_token => invitee.token)
end
end
可以找到Devise Invitable Gem的URL Helper模块here on github
确定原始邀请令牌默认不可访问,因为它是没有访问者(source)的实例变量,有两种方法可以解决这个问题。
丑陋的方式,无需修改模型类:
def invite
invitee = User.invite!({:email => email}, current_user)
raw_token = invitee.instance_variable_get(:@raw_invitation_token)
render :json => accept_invitation_url(invitee, :invitation_token => raw_token)
end
干净的方式,通过向用户模型类添加属性读取器:
# User Model
class User < ActiveRecord::Base
attr_reader :raw_invitation_token
# rest of the code
end
# In your controller
def invite
invitee = User.invite!({:email => email}, current_user)
raw_token = invitee.raw_invitation_token
render :json => accept_invitation_url(invitee, :invitation_token => raw_token)
end
更新(2015年10月16日):
似乎UrlHelper模块已被删除,邀请将作为正常路线处理,因此您可以删除include DeviseInvitable::Controllers::UrlHelpers
并将accept_invitation_url
来电替换为:
Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token => raw_token)
答案 1 :(得分:1)
我发现要在标准邀请邮件查看器视图之外使用accept_invitation_url
,您需要在邮件发送器中包含以下帮助程序:
include Devise::Controllers::UrlHelpers
我尝试了Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token => raw_token)
,但是它不起作用。