设计邀请生成accept_invitation_url

Bru*_*Lin 5 ruby-on-rails devise devise-invitable

我正在使用Devise邀请函。通常,在邀请电子邮件中,会有一个链接将被邀请者重定向到sign_in页面,类似这样的网址

mywebsite.com/users/invitation/accept?invitation_token=J-azZ8fKtkuAyp2VZWQX
Run Code Online (Sandbox Code Playgroud)

该网址来自Invitation_instructions.html:

<p><%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @token) %></p>
Run Code Online (Sandbox Code Playgroud)

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

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

任何想法如何在控制器中获取accept_invitation_url?谢谢!

sle*_*led 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
Run Code Online (Sandbox Code Playgroud)

Devise Invitable Gem 的 URL Helper 模块可以在 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
Run Code Online (Sandbox Code Playgroud)

干净的方法,通过向用户模型类添加属性读取器:

# 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
Run Code Online (Sandbox Code Playgroud)

更新(2015 年 10 月 16 日):

看起来 UrlHelper 模块已被删除,并且邀请被作为正常路由处理,因此您可以删除include DeviseInvitable::Controllers::UrlHelpers并将accept_invitation_url呼叫替换为:

Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token => raw_token)