我正在使用 Javascript 框架构建 Rails 应用程序,因此 Rails 正在为后端 API 提供服务。
目前,该应用程序只是实现所有设计视图和操作。
为此,Rails 应用程序仅接受对其的 JSON 调用/api/
URL,并要求 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(包括设计 URL)并定义 API 资源(目前仅
:users
)
- 然后它定义了
root
route
- 最后将所有调用转发到 Javascript 路由器(允许管理页面重新加载或外部链接(如电子邮件链接))。
除了帐户确认电子邮件链接之外,一切正常。
发送的确认电子邮件包含一个链接,其中包括/api/
(http://localhost:3001/api/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc http://localhost:3001/api/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc),而它应该没有(预期的 URL:http://localhost:3001/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc http://localhost:3001/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc).
我怎样才能设计发送确认电子邮件(以及所有其他电子邮件)而不需要/api/
part?
Update
深入研究设计源代码我发现确认邮件视图模板 https://github.com/plataformatec/devise/blob/master/app/views/devise/mailer/confirmation_instructions.html.erb#L5正在使用confirmation_url
Rails 命名为路线,这是正确的。
就我而言,我需要将所有设计路线限制为/api/
路由,对于 JSON 格式,除了少数路由需要定义两次:第一次超出/api/
HTML 格式的范围(将转发到我的 JavaScript 应用程序),以及/api/
JavaScript 应用程序将调用的范围。
Example:预期账户创建确认执行堆栈
- Rails 收到请求
/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc
- Rails 将请求转发到 Javascript 路由器
- Javascript框架加载对应页面
- Javascript 页面加载一个服务,该服务将调用
/api/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc
设计确认帐户的路线