【问题标题】:Namespaced "error pages" in RailsRails 中的命名空间“错误页面”
【发布时间】:2017-09-08 15:54:35
【问题描述】:

我有以下路由规则可以捕获一些“错误”的 HTTP 状态并将用户重定向到错误页面:

%w[403 404 422 500 503].each do |code|
  match code, to: 'errors#show', code: code, via: :all
end

我还有一个根命名空间和另一个用于“管理员”的命名空间。我想让同样的路由匹配对 admin 命名空间起作用,所以我向它添加了相同的路由规则:

namespace :admin do
    %w[403 404 422 500 503].each do |code|
          match code, to: 'errors#show', code: code, via: :all
    end
end

问题:它不起作用,所有 403 请求都被重定向到 /403 而不是 /admin/403。有没有办法实现这个目标?

我想这样做是因为我需要为错误页面使用 不同的布局 以通过 application 布局以及 admin 来显示它们 布局。

【问题讨论】:

  • 您需要告诉 Rails 将您的路线用作例外应用程序 - 将 config.exceptions_app = self.routes 添加到 config/application.rbmattbrictson.com/dynamic-rails-error-pages
  • 我没有很好地解释自己。我已经这样做了。路由正在工作,但仅适用于根命名空间。它不适用于命名空间管理员。
  • 我真的不认为这是可能的。 Rails 只会调用一个异常应用程序,并且不会真正映射到您对命名空间的想法。当 rails 处理异常时,它并不关心它是否源自您的命名空间。
  • 您可以通过在管理界面使用不同的 Rails 应用程序来解决它。但是用好的 UI 设计来解决它可能会更简单。

标签: ruby-on-rails namespaces http-status-codes


【解决方案1】:

您可能应该使用命名空间为 errors 的 diff 控制器。您可以执行rails generate scaffold_controller admin::errors 之类的操作。然后设置你的路由,使用新的命名空间控制器:

Rails.application.routes.draw do
  root 'home#index'
  %w[403 404 422 500 503].each do |err|
    match err, to: 'errors#show', code: err, via: :all
  end
  namespace :admin do
    %w[403 404 422 500 503].each do |err|
      match err, to: 'admin/errors#show', code: err, via: :all
    end
  end
end

编辑:查看将两个错误控制器之间的 dup 代码移动到更多 DRY 设置的“问题”

【讨论】:

  • 我不相信这会像你想要的那样工作,正如对上述问题的评论所提到的那样——rails 在这一点上不区分命名空间。 (当路由作为异常应用程序处理异常时)。似乎异常仅发送到非命名空间路由。
猜你喜欢
  • 2012-10-24
  • 1970-01-01
  • 2016-07-01
  • 2015-02-02
  • 2013-06-17
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
相关资源
最近更新 更多