Ruby on rails 在Rails范围内使用design_设计生成的邮件URL
我正在用Javascript框架构建一个Rails应用程序,因此Rails提供后端API 目前,该应用程序只是简单地实现了所有设计视图和操作 为了做到这一点,Rails应用程序只接受对其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_
/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应用程序将调用该路由
示例:预期的帐户创建确认执行堆栈
/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc
/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。更清楚吗?