我正在编写一个应用程序,它使用普通的旧Ruby对象(PORO)将授权逻辑从控制器中抽象出来.

目前,我有一个名为NotAuthorized的自定义异常类,在控制器级别是Irescue_from,但我好奇地想知道:Does Rails 4 already come with an exception to indicate that an action was not authorized?我是不是通过实现这个异常来重新发明轮子?

Clarification:raise AuthorizationException不是发生在控制器内部的任何地方,而是发生在控制器外部完全解耦的PORO内部.对象不了解HTTP、路由或控制器.

推荐答案

Rails似乎没有将异常映射到:unauthorized.

默认映射在activerecord/lib/active_record/railtie.rb中定义:

config.action_dispatch.rescue_responses.merge!(
  'ActiveRecord::RecordNotFound'   => :not_found,
  'ActiveRecord::StaleObjectError' => :conflict,
  'ActiveRecord::RecordInvalid'    => :unprocessable_entity,
  'ActiveRecord::RecordNotSaved'   => :unprocessable_entity
)

actionpack/lib/action_dispatch/middleware/exception_wrapper.rb:

@@rescue_responses.merge!(
  'ActionController::RoutingError'             => :not_found,
  'AbstractController::ActionNotFound'         => :not_found,
  'ActionController::MethodNotAllowed'         => :method_not_allowed,
  'ActionController::UnknownHttpMethod'        => :method_not_allowed,
  'ActionController::NotImplemented'           => :not_implemented,
  'ActionController::UnknownFormat'            => :not_acceptable,
  'ActionController::InvalidAuthenticityToken' => :unprocessable_entity,
  'ActionDispatch::ParamsParser::ParseError'   => :bad_request,
  'ActionController::BadRequest'               => :bad_request,
  'ActionController::ParameterMissing'         => :bad_request
)

您可以从应用程序的配置(或自定义Railtie)中添加自定义异常:

Your::Application.configure do

  config.action_dispatch.rescue_responses.merge!(
    'AuthorizationException' => :unauthorized
  )

  # ...

end

或者干脆用rescue_from.

Ruby-on-rails相关问答推荐

通过激励控制器正确更新Turbo帧信源

如何让删除链接响应 Rails 7 中的 turbo_stream 和 html?

如何验证 Rails 中的多态字段关联?

ruby on rails 中的自定义关联

键入rails 控制台无法启动?

Rails 中的转义值(类似于 mysql_real_escape_string())

rails select标签,预先 Select 了多个值

如何在 Ruby 字符串中返回最后一个斜杠(/)之后的所有内容

如何获取 Ruby on Rails 生成的表单元素 id 以供 JavaScript 参考?

对于 Visual Studio 用户来说,最好的 Ruby on Rails 环境是什么?

Rails(或 Ruby):Yes/No 而不是 True/False

不带参数的 request.fullpath

按周/月/等和 ActiveRecord 分组?

Ruby on Rails - link_to 按钮 / css

counter_cache 实现的问题

你如何覆盖 form_for 助手中的类名?

在 Devise on Rails beta 3 中创建管理员用户

在 Rails 中命名布尔列

如何设置 MiniTest?

Rails:您已经激活了 rake 10.3.1,但您的 Gemfile 需要 rake 10.2.2 (Gem::LoadError)