Namespaced控制器无法正常工作,RoutingError:错误的常量名称

时间:2012-05-27 16:44:38

标签: ruby-on-rails ruby routing

我正在尝试在我的Rails 3.2.3应用中设置子目录,以便在http://example.com/api

处为API请求提供服务

我创建了一个目录,如:app/controllers/api/

我遵循实现命名空间控制器的标准约定:

module Api
  class GroupsController < ApplicationController
    # RESTful verbs implemented here
  end
end

我已经设置了这样的命名空间路线:

namespace :api, defaults: {format: 'json'} do
  resources :groups
end

但是,http://example.com/api/groups.json的请求会导致以下异常:

ActionController::RoutingError (wrong constant name groups):
  app/controllers/api/groups_controller.rb:2:in `<module:Api>'
  app/controllers/api/groups_controller.rb:1:in `<top (required)>'

正如您所看到的,这里的名称“groups”似乎无效,因为它是小写的。我不知道这是从哪里来的。

我已经在一些地方读过,右aws gem的一个版本正在打破String#camelize方法并导致类似的错误。但是我已经确认这个gem不在我的Rails应用程序的堆栈中。

对此已经有一段时间了。还有其他人遇到过这个问题吗?

编辑粘贴$ rake routes的输出:

root                /                               welcome#index
api_groups GET      /api/groups(.:format)           api/groups#index {:format=>"json"}
POST                /api/groups(.:format)           api/groups#create {:format=>"json"}
new_api_group GET   /api/groups/new(.:format)       api/groups#new {:format=>"json"}
edit_api_group GET  /api/groups/:id/edit(.:format)  api/groups#edit {:format=>"json"}
api_group GET       /api/groups/:id(.:format)       api/groups#show {:format=>"json"}
PUT                 /api/groups/:id(.:format)       api/groups#update {:format=>"json"}
DELETE              /api/groups/:id(.:format)       api/groups#destroy {:format=>"json"}

1 个答案:

答案 0 :(得分:2)

因此,其根本原因是来自内部gem的一些代码与Rails的路由/命名空间冲突。

但是,此gem中的代码是从较旧版本的Rails中复制/粘贴的,因此其他人可能会遇到同样的问题。

根本原因是gem已经覆盖了Rails在String类上扩展的String#constantize inflection方法。这个gem复制的方法版本与最新版本的Rails和最新版本的Ruby不兼容。

因此,结果是"#{controller_name}".constantize返回了一个camelCase名称,但第一个字符是小写的。

解决方案是更新gem中的这个String#constantize方法以匹配Rails核心的最新版本,或者简单地在gem的代码库中删除/重命名该方法。