【问题标题】:Devise invitation generate accept_invitation_url设计邀请生成accept_invitation_url
【发布时间】:2013-11-06 00:31:09
【问题描述】:

我正在使用 Devise 邀请函。通常,在邀请电子邮件中会有一个链接将受邀者重定向到登录页面,一些像这样的 url

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

此网址来自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 吗?谢谢!

【问题讨论】:

    标签: ruby-on-rails devise devise-invitable


    【解决方案1】:

    尝试在你的控制器中包含 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
    

    Devise Invitable Gem 的 URL Helper 模块可以在 here on 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
    

    干净的方式,通过将属性阅读器添加到您的用户模型类:

    # 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 =&gt; raw_token)

    【讨论】:

    • 感谢 sled,网址看起来不错,但我想我们需要这里的原始邀请令牌,而不是持久的。知道如何获取原始邀请令牌吗?
    • 感谢雪橇,这很有帮助。
    • 它不适用于最新的DeviseInvitable 版本,DeviseInvitable::Controllers::UrlHelpers 不存在。 github.com/scambra/devise_invitable/commit/…已删除
    • @NishutoshSharma 感谢您的提示,我认为他们现在将其作为正常路线实施:github.com/scambra/devise_invitable/blob/…,因此您可以尝试使用Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token =&gt; raw_token)
    【解决方案2】:

    我发现要在标准邀请邮件视图之外使用accept_invitation_url,您需要在邮件中包含以下帮助程序:

    include Devise::Controllers::UrlHelpers
    

    我尝试了Rails.application.routes.url_helpers.accept_invitation_url(invitee, :invitation_token =&gt; raw_token),但它不起作用。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多