5

我正在使用邀请邀请。通常,在邀请电子邮件中会有一个链接将受邀者重定向到登录页面,一些像这样的 url

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>

现在我想在我的控制器中将邀请 url 作为 json 响应返回,如下所示:

def invite
  invitee = User.invite!({:email => email}, current_user)
  accept_invitation_url = ....
  render :json => accept_invitation_url
end

知道如何在控制器中获取 accept_invitation_url 吗?谢谢!

4

2 回答 2

6

尝试在控制器中包含 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

可以在 github 上找到 Devise Invitable Gem 的 URL Helper 模块

好的,默认情况下无法访问原始邀请令牌,因为它是没有访问器()的实例变量,有两种方法可以解决这个问题。

丑陋的方式,不修改你的模型类:

  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)

于 2013-11-06T00:48:56.803 回答
1

我发现要accept_invitation_url在标准邀请邮件视图之外使用,您需要在邮件中包含以下帮助程序:

include Devise::Controllers::UrlHelpers

我试过Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token => raw_token)了,但它不工作。

于 2018-08-09T12:04:04.420 回答