Rails 4.2 初始加载后命名空间路由发生变化
Rails 4.2 Namespace Routes Change after Initial Load
您好,我在 Rails 4.2 命名空间和路由方面遇到了一个奇怪的问题。
我正在从 rails 4.0.13 更新到 Rails 4.2.1 并像这样设置命名空间路由:
namespace :admin do
get '', to: 'dashboard#index', as: '/'
get 'denied', to: 'dashboard#denied', as: '/denied'
get 'blocked', to: 'dashboard#blocked', as: '/blocked'
get 'approved' => 'dashboard#approved', as: '/approved'
end
和 app/controllers/admin/dashboard_controler.rb 的控制器定义为:
class Admin::DashboardController < ApplicationController
# redacted/not important
一旦我启动我的服务器并点击“/admin/approved”端点,页面加载正常。但是,如果我刷新页面,我会收到 404 和此错误:
uninitialized constant AdminDashboardController
所以我检查了 rails/info/routes 发现路线是错误的
Helper HTTP Verb Path Controller#Action
admin_approved_path GET /admin/approved(.:format) admin_dashboard#approved
#note the underscore in the Controller#Action column (4th column)
奇怪。所以我重新启动服务器并点击 rails/info/routes,现在路由正确了!
Helper HTTP Verb Path Controller#Action
admin_approved_path GET /admin/approved(.:format) admin/dashboard#approved
# there's now a slash in Controller#Action
我加载页面并且它工作正常但是当我重新加载它时我得到同样的错误并且检查路线显示它再次改变(斜线变成下划线)。我查看了配置文档,看看我是否做错了什么,但没有任何东西真正跳出来。
还有一些背景信息:这是我从另一个开发人员那里继承的项目,该开发人员不再从事该项目,它非常混乱,我的直觉是某处有一个配置导致了这个问题,但我已经离开了 Rails 一点,我希望社区能帮助我停止拔头发! :)
更新 1:只是想澄清一下,索引路由始终可以正常工作,但拒绝、阻止和批准的路由显示了这种奇怪的工作行为神奇地将路由控制器重写为其他内容并因未初始化的常量错误而失败。
更新 2:我刚刚测试了 Rails 4.1.10 和 4.2.0。该错误不存在于 4.1.10 中,但存在于 4.2.0 中。我即将深入研究 actionpack 以查看这是否是一个真正的问题。
我认为使用 :as 的不必要的覆盖方法可能会导致奇怪的行为。自 4.1 以来,路由也有一些贬值。 https://github.com/rails/rails/blob/4-2-stable/actionpack/CHANGELOG.md
尝试以这种方式重构代码:
namespace :admin do
get '/' => 'dashboard#index'
get '/denied' => 'dashboard#denied'
get '/blocked' => 'dashboard#blocked'
get '/approved' => 'dashboard#approved'
end
因此,在将 render :layout => 'admin'
添加到为坏端点供电的函数后,此错误消失了。不知道为什么会修复它,但确实如此。
修正前:
def index
# redacted...
render :layout => 'admin' # hrm wonder why this always worked *facepalm
end
def denied
# redacted...
end
def blocked
# redacted...
end
def approved
# redacted...
end
修复后:
def index
# redacted...
render :layout => 'admin' # hrm wonder why this always worked *facepalm
end
def denied
# redacted...
render :layout => 'admin'
end
def blocked
# redacted...
render :layout => 'admin'
end
def approved
# redacted...
render :layout => 'admin'
end
刚升级 4.1.8 => 4.2.3 遇到了同样的问题。
namespace :internet, :path => '/' do
get 'provider' => 'provider#list', as: :providers
end
请求应该转到 Internet::ProviderController#list ,但转到 InternetProviderController
在我的例子中,问题出在这个布局中:
<body class="<%= params[:controller].gsub!('/','_') %>-<%= params[:action] %>">
它改变了路线的设置。解决方法很简单:
<body class="<%= params[:controller].gsub('/','_') %>-<%= params[:action] %>">
您好,我在 Rails 4.2 命名空间和路由方面遇到了一个奇怪的问题。
我正在从 rails 4.0.13 更新到 Rails 4.2.1 并像这样设置命名空间路由:
namespace :admin do
get '', to: 'dashboard#index', as: '/'
get 'denied', to: 'dashboard#denied', as: '/denied'
get 'blocked', to: 'dashboard#blocked', as: '/blocked'
get 'approved' => 'dashboard#approved', as: '/approved'
end
和 app/controllers/admin/dashboard_controler.rb 的控制器定义为:
class Admin::DashboardController < ApplicationController
# redacted/not important
一旦我启动我的服务器并点击“/admin/approved”端点,页面加载正常。但是,如果我刷新页面,我会收到 404 和此错误:
uninitialized constant AdminDashboardController
所以我检查了 rails/info/routes 发现路线是错误的
Helper HTTP Verb Path Controller#Action
admin_approved_path GET /admin/approved(.:format) admin_dashboard#approved
#note the underscore in the Controller#Action column (4th column)
奇怪。所以我重新启动服务器并点击 rails/info/routes,现在路由正确了!
Helper HTTP Verb Path Controller#Action
admin_approved_path GET /admin/approved(.:format) admin/dashboard#approved
# there's now a slash in Controller#Action
我加载页面并且它工作正常但是当我重新加载它时我得到同样的错误并且检查路线显示它再次改变(斜线变成下划线)。我查看了配置文档,看看我是否做错了什么,但没有任何东西真正跳出来。
还有一些背景信息:这是我从另一个开发人员那里继承的项目,该开发人员不再从事该项目,它非常混乱,我的直觉是某处有一个配置导致了这个问题,但我已经离开了 Rails 一点,我希望社区能帮助我停止拔头发! :)
更新 1:只是想澄清一下,索引路由始终可以正常工作,但拒绝、阻止和批准的路由显示了这种奇怪的工作行为神奇地将路由控制器重写为其他内容并因未初始化的常量错误而失败。
更新 2:我刚刚测试了 Rails 4.1.10 和 4.2.0。该错误不存在于 4.1.10 中,但存在于 4.2.0 中。我即将深入研究 actionpack 以查看这是否是一个真正的问题。
我认为使用 :as 的不必要的覆盖方法可能会导致奇怪的行为。自 4.1 以来,路由也有一些贬值。 https://github.com/rails/rails/blob/4-2-stable/actionpack/CHANGELOG.md 尝试以这种方式重构代码:
namespace :admin do
get '/' => 'dashboard#index'
get '/denied' => 'dashboard#denied'
get '/blocked' => 'dashboard#blocked'
get '/approved' => 'dashboard#approved'
end
因此,在将 render :layout => 'admin'
添加到为坏端点供电的函数后,此错误消失了。不知道为什么会修复它,但确实如此。
修正前:
def index
# redacted...
render :layout => 'admin' # hrm wonder why this always worked *facepalm
end
def denied
# redacted...
end
def blocked
# redacted...
end
def approved
# redacted...
end
修复后:
def index
# redacted...
render :layout => 'admin' # hrm wonder why this always worked *facepalm
end
def denied
# redacted...
render :layout => 'admin'
end
def blocked
# redacted...
render :layout => 'admin'
end
def approved
# redacted...
render :layout => 'admin'
end
刚升级 4.1.8 => 4.2.3 遇到了同样的问题。
namespace :internet, :path => '/' do
get 'provider' => 'provider#list', as: :providers
end
请求应该转到 Internet::ProviderController#list ,但转到 InternetProviderController
在我的例子中,问题出在这个布局中:
<body class="<%= params[:controller].gsub!('/','_') %>-<%= params[:action] %>">
它改变了路线的设置。解决方法很简单:
<body class="<%= params[:controller].gsub('/','_') %>-<%= params[:action] %>">