我正在尝试让我的管理员后台页面对于未经过身份验证的用户“隐身”。当用户访问类似/admin/my_controller
的内容时,我希望显示404自定义页面,这让他相信这只是一个常规的404.当用户通过身份验证时,他会正确访问控制器。
所以我几乎所有的东西都在工作,我只是错过了设计/监护人的部分。我在我的Rails应用程序中正确配置了404错误救援(在名为ErrorsController
的控制器中实现),所以当有人转到/nothing_here
这样的非现有uri时,我的自定义404页面会正确显示。
我正在尝试将ErrorsController
用作failure_app
几乎完全正常工作,除非我使用不正确的凭据登录时收到异常。我当然只是错过了最后一个细节。例外是
AbstractController::ActionNotFound at /unauthenticated
The action 'create' could not be found for ErrorsController
显然create
操作应该从SessionController
调用,而不是从ErrorsController
调用。这是最后一点缺失的。怎么做到这一点?
在config / application.rb
中config.exceptions_app = self.routes
在config / routes.rb
中get '*dummy', to: 'errors#index'
应用程序/控制器/ errors_controller.rb
class ErrorsController < ApplicationController
def index
display_404
end
end
在config / initializers / devise.rb
中config.warden do |manager|
manager.failure_app = ErrorsController
end
AbstractController::ActionNotFound at /unauthenticated The action 'create' could not be found for ErrorsController
答案 0 :(得分:1)
在用户未登录时处理错误的更优雅方法是向应用程序控制器添加方法。例如display_404
在display_404
方法中添加
raise ActionController::RoutingError.new('Not Found')
当调用此方法时,它将引发Rails&#39;自己的错误页面和日志&#39; Not Found&#39;在日志文件中。在开发中,这将在屏幕上显示,但是对于生产它只能在日志文件中找到,因此添加类似'User was not signed in'
的内容是可能的。
然后使用
before_action do
unless admin_signed_in?
display_404
end
end
访问者未登录时将显示错误页面。