Разработать приглашение генерировать accept_invitation_url

Я использую Devise для приглашения. Как правило, в электронном письме с приглашением будет ссылка для перенаправления приглашенного на страницу входа, например, URL-адрес

mywebsite.com/users/invitation/accept?invitation_token=J-azZ8fKtkuAyp2VZWQX

Этот URL-адрес поступает из приглашение_инструкции.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 в контроллере? Спасибо!

2 ответа

Решение

Попробуйте включить модуль 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

Модуль URL Helper для Devise Invitable Gem можно найти здесь, на github.

Хорошо, необработанный токен по умолчанию недоступен, потому что это переменная экземпляра без accessor ( 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

Обновление (16 октября 2015 г.):

Кажется, что модуль UrlHelper был удален, а приглашение обрабатывается как обычный маршрут, поэтому вы можете удалить include DeviseInvitable::Controllers::UrlHelpers и заменить accept_invitation_url позвонить с:

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

Я узнал, что использовать accept_invitation_url вне стандартного представления почтовой программы приглашения вы должны включить в почтовую программу следующий помощник:

include Devise::Controllers::UrlHelpers

Я старался Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token => raw_token) Но это не работает.

Другие вопросы по тегам