我正在使用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
要解释这里发生了什么:
:users
)root
路线除了帐户确认电子邮件链接外,一切正常。
发送的确认电子邮件中包含/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应用程序调用。
示例:预期的帐户创建确认执行堆栈
/api/
/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc
设计路线以确认帐户答案 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)
有两种方法可以解决您的问题。
json
格式(最后包含'.json')或
html
(不含format: '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
如果您不想使用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视图,包括您可以自定义的邮件程序模板。