【发布时间】:2011-09-08 05:00:37
【问题描述】:
设计中的控制器是自动生成的吗?你如何访问它们?
我知道你的看法
rails generate devise_views.
【问题讨论】:
-
这个问题的答案取决于您使用的 Rails 版本。如果在 2016 年使用 Rails 4,则正确答案未标记为正确。
标签: ruby-on-rails devise
设计中的控制器是自动生成的吗?你如何访问它们?
我知道你的看法
rails generate devise_views.
【问题讨论】:
标签: ruby-on-rails devise
假设您希望查看这些控制器以修改或覆盖它们,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 键,这并不意味着显示。如果您打算打印整个散列,请从散列中删除此键。
【讨论】:
super... 它有助于覆盖,但如果你不想这样做,你仍然必须从原始控制器复制代码全部重写。是否可以选择实际显示整个控制器?在我的示例中,我只想检查环境模式,如果它正在开发中,请跳过确认邮件。 ps:在这里找到了很棒的答案:stackoverflow.com/a/21169179/5909738
Devise 使用内部控制器,您可以在自己的代码中对其进行访问和子类化。它们位于Devise 模块下。例如,扩展RegistrationsController:
class MembershipsController < Devise::RegistrationsController
# ...
end
那么你所要做的就是配置 Devise 的路由来使用你的控制器:
devise_for :members, :controllers => { :registrations => 'memberships' }
【讨论】:
$ rails generate devise:controllers SCOPE [options]
选项: -c, [--controllers=一二三]
使用 -c 指定要覆盖的控制器。 如果您不指定控制器,则将创建所有设计控制器。 例如:
rails generate devise:controllers users -c=sessions
这将在 app/controllers/users/sessions_controller.rb 中创建一个控制器类,如下所示:
class Users::ConfirmationsController < Devise::ConfirmationsController
content...
end
【讨论】:
以下是 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/... 移动视图,以便您的新控制器可以找到它们。
见@ErikTrautman 的回答。
您必须检查源代码(特别是在项目根目录的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
【讨论】: