1

我正在尝试在我的 Rails 3.2.3 应用程序中设置一个子目录来服务 API 请求: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)>'

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

我在几个地方读到了 right-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"}
4

1 回答 1

2

所以造成这种情况的根本原因是来自内部 gem 的一些代码与 Rails 的路由/命名空间冲突。

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

根本原因是 gem 覆盖了 Rails 在 String 类上扩展的 String#constantize 变形方法。这个 gem 复制的方法版本不能很好地与最新版本的 Rails 和最新版本的 Ruby 配合使用。

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

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

于 2012-05-27T17:44:46.647 回答