Создать приглашение сгенерировать accept_invitation_url

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

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

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


person Bruce Xinda Lin    schedule 06.11.2013    source источник


Ответы (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 для Devise Invitable Gem можно найти здесь. на гитхабе

Хорошо, необработанный токен приглашения недоступен по умолчанию, потому что это переменная экземпляра без доступа (источник), решить эту проблему можно двумя способами.

Уродливый способ, без изменения класса модели:

  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)

person sled    schedule 06.11.2013
comment
спасибо, URL-адрес выглядит хорошо, но я думаю, нам нужен необработанный токен приглашения, а не сохраненный. Любая идея, как получить необработанный токен приглашения? - person Bruce Xinda Lin; 06.11.2013
comment
Спасибо sled, это было очень полезно. - person Bruce Xinda Lin; 06.11.2013
comment
Не работает для последней DeviseInvitable версии, DeviseInvitable::Controllers::UrlHelpers не существует. github.com/scambra/devise_invitable/commit/ Он был удален. - person Nishutosh Sharma; 16.10.2015
comment
@NishutoshSharma спасибо за подсказку, я думаю, что теперь они реализовали его как обычный маршрут здесь: github.com/scambra/devise_invitable/blob/, так что вы можете попробовать использовать Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token => raw_token) - person sled; 16.10.2015

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

include Devise::Controllers::UrlHelpers

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

person Matteo Alessani    schedule 09.08.2018