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)>'

ご覧のとおり、ここでの「groups」という名前は小文字であるため、有効ではないようです。しかし、これがどこから来ているのかわかりません。

いくつかの場所で、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

したがって、これの根本的な原因は、Railsのルーティング/名前空間と競合する内部gemからのコードでした。

ただし、このgemのコードは、古いバージョンのRailsからコピー/貼り付けされているため、他の人が同じ問題に遭遇する可能性があります。

根本的な原因は、RailsがStringクラスで拡張するString#constantizeインフレクションメソッドをgemがオーバーライドしたことです。このgemがコピーしたメソッドのバージョンは、最新バージョンのRailsおよび最近のバージョンのRubyではうまく機能しません。

その結果"#{controller_name}".constantize、キャメルケース名が返されましたが、最初の文字は小文字でした。

解決策は、gemのこのString#constantizeメソッドを更新して、Railsコアの最新バージョンと一致させるか、gemのコードベース内でそのメソッドを削除/名前変更することです。

于 2012-05-27T17:44:46.647 に答える