27538


JSON APIとHTMLベースのwebアプリ両方を含んだrails4アプリを作ろうとしています。  
`/api`以下に来たリクエストに関してはパフォーマンスの最適化ためrails_apiで使用される最低限のミドルウェアを介してレスポンスを返し、それ以外のリクエストに関してはデフォルトのRailsのミドルウェアセットを介して処理をさせていと考えています。

現状、  
\- rails_api gemを追加  
\- routes.rbにてapiをnamespaceで分ける  
\- apiのコントローラに関しては`ActionController::API`を継承させる  
\- HTMLベースのコントローラに関しては`ActionController::Base` を継承させる

という方針で進めています。以下、主な部分のコードです。

app/controllers/base_api_controller.rb

[code]

    class BaseApiController < ActionController::API
        ...
    end
    
[/code]

app/controllers/api/projects_controller.rb

[code]

    module Api
      class ProjectsController < BaseApiController
        def index
          ..
        end
      end
    end
    
[/code]

app/controllers/application_controller.rb

[code]

    class ApplicationController < ActionController::Base
      ..
    end
    
[/code]

app/controllers/projects_controller.rb

[code]

    class ProjectsController < ApplicationController
      def index
        ..
      end
    end
    
[/code]

config/routes.rb

[code]

    namespace :api do
      resource :projects
    end
    
    resource :projects
    
[/code]

config/application.rb

[code]

    config.autoload_paths += %W(
      #{config.root}/app/controllers/api
    )
    
[/code]

この状態で`/api/projects`にリクエストをなげるとうまく`/app/controllers/projects_controller.rb`が処理してくれるのですが,
`/projects`にアクセスすると`/app/controllers/projects_controller.rb`に処理して欲しいところ、以下のエラーが表示されます。

[code]

    Unable to autoload constant ProjectsController, 
    expected /app/controllers/api/projects_controller.rb to define it. 
    
[/code]

どのようにすれば正しく動くように修正できますでしょうか。  
もしくは、そもそもこの実装方針自体おかしいようでしたら代案を教えていただけますと幸いです。


CC BY-SA 3.0
2016-07-10T20:52:44.500
27512
2016-07-11T13:14:19.200
2016-07-10T23:32:00.087
17127
17127
question
ruby-on-rails
rails4にて、rails_apiとwebベースのhtmlアプリを同時に使う


以下の設定が必要なさそうです。

[code]

    config.autoload_paths += %W(
      #{config.root}/app/controllers/api
    )
    
[/code]

`ProjectsController`をロードする際`autoload_paths`に設定されているディレクトリ以下からprojects_controller.rbを探そうとします。  
`autoload_paths`にapp/controllers/apiが入っていると、app/controllers/projects_controller.rbより先にapp/controllers/api/projects_controller.rbが見つかってしまいます。  
Railsは`ProjectsController`が定義されることを期待しているのでエラーになってします。

Railsはネームスペースの下のクラスを、ネームスペースと同じ名前のディレクトリの下から探すので、`autoload_paths`からapp/controllers/apiを削除しても、`Api::ProjectsController`はうまく動きます。

Railsガイドの[定数の自動読み込みと再読み込み](http://railsguides.jp/constant_autoloading_and_reloading.html)でこのあたりの仕組みが詳しく解説されているので、参考になると思います。


CC BY-SA 3.0
2016-07-11T13:14:19.200
27538
2016-07-11T13:14:19.200
2599
27512
answer