设计邀请生成accept_invitation_url

时间:2013-11-06 00:31:09

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

我正在使用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吗?谢谢!

2 个答案:

答案 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),但是它不起作用。