在Rails范围中使用devise_for设计生成的邮件程序URL

时间:2018-05-08 06:04:49

标签: ruby-on-rails devise

我正在使用Javascript框架构建Rails应用程序,因此Rails正在为后端API提供服务。

目前,该应用只是实现所有设计视图和操作。

为了做到这一点,Rails应用程序只接受对其/api/ URL的JSON调用,并要求Devise仅使用JSON调用,因此我将它们定义如下:

Rails.application.routes.draw do
  scope :api, module: :api, constraints: { format: 'json' } do
    devise_for :users, controllers: {
      confirmations: 'devise/confirmations',
      registrations: 'devise/registrations',
      sessions: 'sessions'
    }

    resources :users
  end

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root to: 'home#index'
  get '*path', to: 'home#index'
end

要解释这里发生了什么:

  • 第一部分是定义API URL,包括设计的API,并定义API资源(目前仅限:users
  • 然后定义root路线
  • 最后转发任何对Javascript路由器的调用(允许管理页面重新加载或外部链接,如电子邮件链接)。

除了帐户确认电子邮件链接外,一切正常。 发送的确认电子邮件中包含/api/http://localhost:3001/api/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc)的链接,但应该没有(预计网址:http://localhost:3001/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc)。

如何在没有/api/部分的情况下发送确认电子邮件(以及所有其他电子邮件)?

更新

深入了解设计源代码,我发现the confirmation mailer view template正在使用名为route的confirmation_url Rails,这是正确的。

在我的情况下,我需要将所有设计路由限制为/api/路由和JSON格式,除了定义2次的几条路由:第一次超出{{1} HTML格式的范围(将转发到我的JavaScript应用程序),以及/api/范围内的第二条路径,将由JavaScript应用程序调用。

示例:预期的帐户创建确认执行堆栈

  1. Rails收到/api/
  2. 的请求
  3. Rails将请求转发给Javascript路由器
  4. Javascript框架加载相应的页面
  5. Javascript页面加载一项服务,该服务将调用/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc设计路线以确认帐户

2 个答案:

答案 0 :(得分:0)

您应该能够在初始API路由之后添加两个额外的路由。像这样:

Rails.application.routes.draw do
  scope :api, module: :api, constraints: { format: 'json' } do
    devise_for :users, controllers: {
      confirmations: 'devise/confirmations',
      registrations: 'devise/registrations',
      sessions: 'sessions'
    }

    resources :users
  end

  devise_for :users, controllers: {
    confirmations: 'devise/confirmations',
    registrations: 'devise/registrations'
  }

  root to: 'home#index'
  get '*path', to: 'home#index'
end

如果没有看到前端代码,很难肯定地说,但是两条路线都可以。

答案 1 :(得分:0)

有两种方法可以解决您的问题。

  1. 使电子邮件中的链接为json格式(最后包含'.json')
    1. 允许通过html(不含format: 'json'约束)的电子邮件链接操作。
    2. 此示例显示如何执行电子邮件确认操作。

      scope :api, module: :api, constraints: { format: 'json' } do
        # skip routes generation for `confirmations` controller
        devise_for :users, skip: [:confirmations]
      
        # add allowed `confirmations` actions manually (all except for `show`)
        as :user do
          get 'confirmation/new', to: 'devise/confirmations#new', as: :new_user_confirmation
          post 'confirmation', to: 'devise/confirmations#create'
        end
      end
      
      # add `confirmations#show` action outside of `/api` scope to be available from email link by `html`
      as :user do
        get 'confirmation', to: 'devise/confirmations#show', as: :user_confirmation
      end
      

      如果您不想使用Devise的HTML视图和操作,您可以自定义Devise控制器或编写自己的。此示例显示如何自定义Devise确认控制器:

      # app/controllers/confirmations_controller.rb
      class ConfirmationsController < Devise::ConfirmationsController
        def show
          # do whatever you want
        end
      end 
      
      # config/routes.rb
      scope :api, module: :api, constraints: { format: 'json' } do
        # tell Devise to use your custom confirmations controller
        devise_for :users, controllers: {confirmations: "confirmations"}
      end
      

      已更新

      此外,如果您希望您的电子邮件链接与Devise API无关,您可以自定义Devise邮件程序视图以更改电子邮件文本并将所需链接放在那里。

      rails generate devise:views命令将生成标准的Devise视图,包括您可以自定义的邮件程序模板。