【问题标题】:How do you access Devise controllers?您如何访问设计控制器?
【发布时间】:2011-09-08 05:00:37
【问题描述】:

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

我知道你的看法 rails generate devise_views.

【问题讨论】:

  • 在此处转发此问题:stackoverflow.com/questions/3546289/…
  • 这个问题的答案取决于您使用的 Rails 版本。如果在 2016 年使用 Rails 4,则正确答案未标记为正确。

标签: ruby-on-rails devise


【解决方案1】:

假设您希望查看这些控制器以修改或覆盖它们,Devise 现在提供了一个简单的生成器,该生成器可以在您的应用中重新创建它们的控制器以简化此操作。根据the documentation(将是最新的):

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

控制台

rails generate devise:controllers [scope]

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

class Users::SessionsController < Devise::SessionsController
  # GET /resource/sign_in
  # def new
  #   super
  # end
  ...
end

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

devise_for :users, controllers: { sessions: "users/sessions" }

3) 将视图从devise/sessions 复制到users/sessions。由于控制器已更改,它不会使用位于 devise/sessions 中的默认视图。


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

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

class Users::SessionsController < Devise::SessionsController
  def create
    # custom sign-in code
  end
end

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

class Users::SessionsController < Devise::SessionsController
  def create
    super do |resource|
      BackgroundWorker.trigger(resource)
    end
  end
end

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

请记住,Devise 使用 Flash 消息让用户知道登录是成功还是失败。 Devise 希望您的应用程序酌情调用flash[:notice]flash[:alert]。不要打印整个闪存哈希,只打印特定的键。在某些情况下,Devise 会在 Flash 哈希中添加一个 :timedout 键,这并不意味着显示。如果您打算打印整个散列,请从散列中删除此键。

【讨论】:

  • 这是目前最好的方法,应该是最佳答案。
  • 我不必更改视图的位置,我假设 rails 只是在 Devise 目录中寻找它们,因为它很聪明,哟。
  • 是的,我同意现在应该将其标记为 2016 年的正确答案。
  • 同时运行 bundle update devise 以确保您的版本支持它。此外,您不需要更改视图的位置。
  • 这仍然只会显示一个控制器,其中方法只包含 super... 它有助于覆盖,但如果你不想这样做,你仍然必须从原始控制器复制代码全部重写。是否可以选择实际显示整个控制器?在我的示例中,我只想检查环境模式,如果它正在开发中,请跳过确认邮件。 ps:在这里找到了很棒的答案:stackoverflow.com/a/21169179/5909738
【解决方案2】:

Devise 使用内部控制器,您可以在自己的代码中对其进行访问和子类化。它们位于Devise 模块下。例如,扩展RegistrationsController

class MembershipsController < Devise::RegistrationsController
  # ...
end

那么你所要做的就是配置 Devise 的路由来使用你的控制器:

devise_for :members, :controllers => { :registrations => 'memberships' }

【讨论】:

  • 有没有办法像查看视图一样简单地查看设计控制器?就我而言,我想将代码添加到设计注册控制器而不是重写它;而且我不确定我想在哪里以及如何添加它而没有看到他们的第一个内容。有什么建议吗?
  • @mmichael,你可以找到Devise的控制器源代码here。通过阅读源代码,您可以了解每种方法的作用,然后找出实现功能的最佳方法。
  • 谢谢,终于把事情搞清楚了!
【解决方案3】:

$ rails generate devise:controllers SCOPE [options]

选项: -c, [--controllers=一二三]

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

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

rails generate devise:controllers users -c=sessions

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

 class Users::ConfirmationsController < Devise::ConfirmationsController
    content...
 end

【讨论】:

    【解决方案4】:

    以下是 Rails 5

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

    rails generate devise:controllers users
    

    如果你修改了上面生成的控制器,在routes.rb中加入下面一行,

    devise_for :users, controllers: {registrations:'user/registrations'}
    

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

    【讨论】:

    • 执行此操作时,您还需要从app/views/devise/CONTROLLER/... -> app/views/users/CONTROLLER/... 移动视图,以便您的新控制器可以找到它们。
    【解决方案5】:

    要定义自定义控制器行为,

    见@ErikTrautman 的回答。

    但是,如果您想了解 Devise 在幕后所做的事情,

    您必须检查源代码(特别是在项目根目录的app/ 目录中)。 @MatheusMoreira 在 GitHub 上提供了一个源链接,但如果您希望在自己的文本编辑器中本地浏览它,您可以使用 gem which devise 找到 Devise gem 的安装位置。

    比如看Devise::SessionsController:

    $ vim $(gem which devise | sed 's|\(.*\)\(/.*\)\{2\}|\1|')/app/controllers/devise/sessions_controller.rb
    

    (或者,您可以克隆 git 存储库并以这种方式四处寻找。)

    $ git clone https://github.com/plataformatec/devise
    $ cd devise
    $ vim app/controllers/devise/sessions_controller.rb
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      相关资源
      最近更新 更多