【问题标题】:Devise with different parent class设计不同的父类
【发布时间】:2015-07-06 02:42:48
【问题描述】:

我在我的 Rails 应用程序中使用设计,我在“/...”有一个 html 版本,在“/api/v#/...”有一个 api 设计控制器的实现应该在'/sign_in' 和 '/api/v1/sign_in' 等。我还有一个 ApiController,我在 api 命名空间中的所有控制器都继承自。

基本上,我的应用程序需要两组不同的设计,每组都有不同的父类。

我能够在 api 命名空间中生成控制器并将 devise 的父级更改为 ApiController,但这会破坏常规站点。那是行不通的。

我可以为我的 ApiController 制作一个模块,然后将它包含在每个设计控制器中......但这看起来很臭。

在 api 中我只需要一些设计功能,所以也许我可以在没有设计的情况下直接实现它们。但是我会失去确认功能和其他东西。

我该怎么办?

如果您想查看任何代码,请告诉我。

【问题讨论】:

  • 不同的父类是指两个不同的ActiveModel?
  • 您可以更改设计继承的类。默认是ApplicationController,但是我把它改成了ApiController(继承自ApplicationController)。

标签: ruby-on-rails devise


【解决方案1】:

您可以指定在路由中使用哪些控制器:

devise_for :users # uses the normal devise controllers

namespace :api do
  devise_for :users, controllers: { sessions: 'api/sessions' }
end  

class Api::SessionsController < Devise::SessionsController
end

也就是说 - 创建您自己的控制器以使用 Warden(Devise 的较低级别组件)在 API 中处理身份验证和会话非常简单,并且比将 Devise 硬塞到做基于令牌的身份验证或 HMAC 中要干净得多。

【讨论】:

  • 我最终创建了自己的 Warden 身份验证。感谢您的建议。
  • @max 但这不会导致 Devise 从 ApplicationController 继承,并且应用程序控制器中定义的所有回调都将在另一个范围内使用。例如不需要从应用程序控制器继承的 API。
  • 您的控制器仅继承自您选择的任何超类。在此示例中,它继承自 Devise::SessionsController 而不是 ApplicationController
  • @max 您所说的是正确的,但这里的问题是 Api::SessionsController 继承自 Devise::SessionsController 但 Devise 本身是从 ApplicationController Devise::SessionsController github.com/plataformatec/devise/blob/…, github.com/plataformatec/devise/blob/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2017-09-11
相关资源
最近更新 更多