我正在尝试在我的Rails 3.2.3应用中设置子目录,以便在http://example.com/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"}
答案 0 :(得分:2)
因此,其根本原因是来自内部gem的一些代码与Rails的路由/命名空间冲突。
但是,此gem中的代码是从较旧版本的Rails中复制/粘贴的,因此其他人可能会遇到同样的问题。
根本原因是gem已经覆盖了Rails在String类上扩展的String#constantize inflection方法。这个gem复制的方法版本与最新版本的Rails和最新版本的Ruby不兼容。
因此,结果是"#{controller_name}".constantize
返回了一个camelCase名称,但第一个字符是小写的。
解决方案是更新gem中的这个String#constantize方法以匹配Rails核心的最新版本,或者简单地在gem的代码库中删除/重命名该方法。