Ruby on rails 在Rails范围内使用design_设计生成的邮件URL

Ruby on rails 在Rails范围内使用design_设计生成的邮件URL,ruby-on-rails,devise,Ruby On Rails,Devise,我正在用Javascript框架构建一个Rails应用程序,因此Rails提供后端API 目前,该应用程序只是简单地实现了所有设计视图和操作 为了做到这一点,Rails应用程序只接受对其/api/URL的JSON调用,并要求Desive只处理JSON调用,因此我对它们进行了如下定义: Rails.application.routes.draw do scope :api, module: :api, constraints: { format: 'json' } do devise_

我正在用Javascript框架构建一个Rails应用程序,因此Rails提供后端API

目前,该应用程序只是简单地实现了所有设计视图和操作

为了做到这一点,Rails应用程序只接受对其
/api/
URL的JSON调用,并要求Desive只处理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,包括designe URL,并定义API资源(目前仅限于
    :users
  • 然后定义
    根路径
    路由
  • 最后将所有调用转发到Javascript路由器(允许管理页面重新加载或外部链接,如电子邮件链接)
除帐户确认电子邮件链接外,所有这些都可以正常工作。 发送的确认电子邮件有一个包含
/api/
()的链接,但应该没有(预期URL:)

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

更新

深入查看designe源代码,我发现它使用了名为route的
confirmation\uurl
Rails,这是正确的

在我的例子中,我需要将所有Desive路由限制为
/api/
路由和JSON格式,但少数路由需要2次定义:第一次以HTML格式超出
/api/
范围(将转发到我的JavaScript应用程序),以及
/api/
范围内的第二条路由,JavaScript应用程序将调用该路由

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

  • Rails接收到对
    /users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc
  • Rails将请求转发到Javascript路由器
  • Javascript框架加载相应的页面
  • Javascript页面加载一个服务,该服务将调用
    /api/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc
    设计路径来确认帐户

  • 您应该能够在初始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
    

    如果不同时看到前端代码,很难确定,但两条路线都可以。有两种方法可以解决问题

  • 将电子邮件中的链接设置为
    json
    格式(末尾有“.json”)
  • 允许通过
    html
    (无
    格式:'json'
    约束)访问电子邮件链接的操作 此示例演示如何为电子邮件确认操作执行此操作

    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
    
    如果您不想使用Desive的HTML视图和操作,可以自定义Desive控制器或编写自己的控制器。此示例显示如何自定义设计确认控制器:

    # 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
    
    #app/controllers/confirmations_controller.rb
    类确认控制器<设计::确认控制器
    def秀
    #你想干什么就干什么
    结束
    结束
    #config/routes.rb
    作用域:api,模块::api,约束:{format:'json'}do
    #告诉Desive使用您的自定义确认控制器
    为用户、控制者设计{确认:“确认”}
    结束
    
    已更新

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


    rails generate designe:views
    命令将生成标准的designe视图,包括您可以自定义的mailer模板。

    谢谢您的回答。我将尝试一下,但我的第一个想法是,这也将接受HTTP路由来访问HTML Desive页面并确认帐户,还是我遗漏了什么?好的,但我不希望这样。我希望用户只通过Javascript应用程序来呈现视图,而不是设计视图。如果不需要这些路由,只需将它们重定向到控制器级别的api路由即可。如果您正在使用SPA,它应该重定向到路由索引,然后SPA路由工具处理显示正确页面的操作。与其他答案一样,这将使用Desive的HTML视图和操作,而我希望我的Javascript应用程序处理所有视图部分,并让back(
    /api/
    )来处理操作。我不想允许确认操作,我希望它们成为我的后端API和前台管理所有视图的一部分。那么第一个选项呢?(“.json”链接)我不明白。为什么JSON和HTML格式会有帮助?Javascript应用程序使用JSON与API对话,用户使用HTML访问该应用程序。更新了答案以解释如何不使用Desive视图和操作。抱歉,看起来我不够清楚。我想要的是Desive是我的API(注册用户等)的一部分,它今天已经开始工作了,我想要我的Javascript应用程序管理所有的视图内容。我的问题是,来自Desive发送的电子邮件的链接的URL包含
    /api/
    部分,我不希望这样,调用被重定向到Javascript应用程序,而JS应用程序调用通过api Desive。更清楚吗?