你如何访问Devise控制器?

kat*_*tie 40 ruby-on-rails devise

设备中的控制器是否自动生成?你如何访问它们?

我知道你的观点 rails generate devise_views.

Eri*_*man 41

假设您想要查看这些控制器以便修改或覆盖它们,Devise现在提供了一个简单的生成器,可以在您的应用程序中重新创建它们的控制器以简化这些操作.根据文档(将是最新的):

1)使用需要范围的生成器创建自定义控制器:

安慰

rails generate devise:controllers [scope]
Run Code Online (Sandbox Code Playgroud)

如果指定users作为范围,则将在中创建控制器app/controllers/users/.会话控制器将如下所示:

class Users::SessionsController < Devise::SessionsController
  # GET /resource/sign_in
  # def new
  #   super
  # end
  ...
end
Run Code Online (Sandbox Code Playgroud)

2)告诉路由器使用此控制器:

devise_for :users, controllers: { sessions: "users/sessions" }
Run Code Online (Sandbox Code Playgroud)

3)将视图复制devise/sessionsusers/sessions.由于控制器已更改,因此不会使用位于的默认视图devise/sessions.


4)最后,更改或扩展所需的控制器操作.

您可以完全覆盖控制器操作:

class Users::SessionsController < Devise::SessionsController
  def create
    # custom sign-in code
  end
end
Run Code Online (Sandbox Code Playgroud)

或者您可以简单地向其添加新行为:

class Users::SessionsController < Devise::SessionsController
  def create
    super do |resource|
      BackgroundWorker.trigger(resource)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这对于在某些操作期间触发后台作业或记录事件非常有用.

请记住,Devise使用Flash消息让用户知道登录是成功还是失败.设计预计您的应用程序调用flash[:notice]flash[:alert]适当.不要打印整个Flash哈希,只打印特定的键.在某些情况下,Devise会为:timedout闪存哈希添加一个密钥,而不是用于显示.如果要打印整个哈希,请从哈希中删除此键.


Mat*_*ira 40

Devise使用内部控制器,您可以在自己的代码中访问和子类.他们在Devise模块下.例如,扩展RegistrationsController:

class MembershipsController < Devise::RegistrationsController
  # ...
end
Run Code Online (Sandbox Code Playgroud)

然后,您所要做的就是配置Devise的路由以使用您的控制器:

devise_for :members, :controllers => { :registrations => 'memberships' }
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法简单地像设置视图一样查看设计控制器?在我的情况下,我想将代码添加到设计注册控制器而不是重写它; 而且我不确定在没有看到第一个内容的情况下我想在哪里以及如何添加它.有什么建议? (8认同)
  • @mmichael,你可以找到Devise控制器的源代码[这里](https://github.com/plataformatec/devise/tree/master/app/controllers/devise).通过阅读源代码,您可以了解每种方法的作用,然后找出实现功能的最佳方法. (6认同)
  • 谢谢,最后澄清了这个问题! (2认同)

ind*_*ndb 11

$ rails generate devise:controllers SCOPE [options]

选项:-c,[ - 控制器=一二三]

选择要生成的特定控制器(确认,密码,注册,会话,解锁,omniauth_callbacks)

使用-c指定要覆盖的控制器.如果未指定控制器,则将创建所有设计控制器.例如:

rails generate devise:controllers users -c = sessions

这将在app/controllers/users/sessions_controller.rb中创建一个控制器类,如下所示:

 class Users::ConfirmationsController < Devise::ConfirmationsController
    content...
 end
Run Code Online (Sandbox Code Playgroud)


小智 9

下面一个是 Rails 5

使用以下命令生成 rails 设计控制器:

rails generate devise:controllers users
Run Code Online (Sandbox Code Playgroud)

如果您修改了上面生成的控制器,请将以下行添加到routes.rb,

devise_for :users, controllers: {registrations:'user/registrations'}
Run Code Online (Sandbox Code Playgroud)

您的修改将在您重新启动 rails 服务器后生效