Разработать приглашение генерировать 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)
Но это не работает.