Rails 4.2命名空间路由在初始加载后更改

时间:2015-05-31 20:39:31

标签: ruby-on-rails ruby-on-rails-4 rails-routing

您好我在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

启动我的服务器并点击&#39; / admin / approved&#39;端点页面加载正常。但是,如果我刷新页面,我会收到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

我加载页面并且它工作正常但是一旦我重新加载它我得到相同的错误并且检查路线显示它再次改变(斜线变成下划线)。我查看了配置文档,看看我是否做错了什么但没有真正跳出来。

还有一些上下文:这是一个我从另一个开发者那里继承的项目,他不再使用它并且它非常混乱我的预感是有一个配置在某个地方引起了这个但是我&#39我已经远离Rails了一下,我希望社区可以帮我停止拔头发! :)

更新1 :只是想澄清索引路由始终没有问题,但拒绝,阻止和批准的路由是显示这种奇怪行为的工作,然后神奇地重写路由控制器与其他事情一起失败并且没有未初始化的常数错误。

更新2 :我刚刚测试了Rails 4.1.10和4.2.0。 4.1.10中不存在该错误,但它存在于4.2.0中。我即将潜入actionpack,看看这是否是一个真正的问题。

3 个答案:

答案 0 :(得分:0)

我认为奇怪的行为可能来自不必要的重写方法: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

答案 1 :(得分:0)

因此,将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

答案 2 :(得分:0)

刚升级4.1.8 =&gt; 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] %>">