5

招待にはDevise invitableを使用しています。通常、招待メールには、招待者をサインイン ページにリダイレクトするためのリンクが含まれています。

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

この URL は、invitation_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を取得する方法はありますか? ありがとう!

4

2 に答える 2

6

コントローラーに url ヘルパー モジュールを含めてみてください。

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 ヘルパー モジュールは、githubで見つけることができます。

未加工の招待トークンはアクセサー ( source ) のないインスタンス変数であるため、デフォルトではアクセスできません。これを解決するには 2 つの方法があります。

モデルクラスを変更せずに醜い方法:

  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)

于 2013-11-06T00:48:56.803 に答える