1

のRails 3.0.7、私は我々のアプリのためのAPIを作成しています、と私は、このセットアップ持っ使用:ネストされた名前空間のルート

namespace :api do 
    namespace :v1 do 
     match "connect" => "users#login", :via => :post 
     match "disconnect" => "users#logout", :via => :post 
     resources :users 
     match "users/:id/foos" => "foos#list", :via => :get 
     match "users/:id" => "users#update", :via => :put 
     match "foos/:id/bars" => "bars#list_by_foo", :via => :get 
     match "foos/:id" => "foos#show", :via => :get, :constraints => { :id => /\d+/ } 
     match "bars/:id" => "bars#show", :via => :get 
    end 
    end 

    # other routes here e.g. 
    match "users/find" => "users#find_by_name", :via => :get 
    match "users" => "users#create", :via => :post 

そして、私が持っている

routes.rbをし私の定期的なapp/controllers/application_controller.rbapp/controllers/users_controller.rbファイルだけでなく、次のように定義されている私のapp/controllers/api/v1/application_controller.rbapp/controllers/api/v1/users_controller.rbファイル:

class Api::V1::ApplicationController < ApplicationController 
    before_filter :verify_access 

    def verify_access 
    # some code here 
    end 
end 

class Api::V1::UsersController < Api::V1::ApplicationController 
    skip_before_filter, :except => [:show, :update, :delete] 
end 

そして、すべての場所の前にUsersControllerとApi :: V1 :: UsersControllerの両方で共有されるメソッドをオーバーライドするまでは正常に動作していたように見えますが、今はapi/v1/usersを介してアクセスしていてもすべてがUsersControllerを指しているようですルート。

私はそれを理解しようとしています。助言がありますか?ありがとう。 PS - 私が無視しているべきでないことを無視している慣習をコメントしてください。

+0

私は、ネームスペースに関係なく、すべてのコントローラ名を一意にする必要がありました。 [ここには助けたリンクがあります](http://blog.philburrows.com/articles/2008/05/02/rails-namespaces-rock-rails-namespaces-suck-/) – paulnsorensen

答えて

0

skip_before_filterまた、スキップする前のフィルタのシンボルパラメータを取ることもできます。適切なスコープ/名前空間が適用されている限り、コントローラ名は一意である必要はありません。

  • API/users_controller
  • 管理/ users_controller
  • users_controller

コントローラあたりコードは

class Api::V1::UsersController < Api::V1::BaseController 
end 

class Admin:UsersController < Admin::BaseController 
end 

class UsersController < ApplicationController 
end 

経路

MyApp::Application.routes.draw do 

scope :module => "api" do 
    namespace :v1 do 
    resources :users 
    end 
end 

namespace :admin do 
    resources :users 
end 

    resources :users 
end 
0

Railsはちょっと混乱しますが、同様の問題がありました。小さなコードの問題を逃していないことを確認するためにできる手順は次のとおりです。 (これにより、最終的には、名前空間コントローラの構文バグが発見されました)。

  1. run bundle exec rake routesどのコントローラーとアクションにどのリンクがリンクするかのリストを生成する。これが良い場合は、手順2に進みます。そうでない場合は、経路ファイルを修正して、もう一度やり直してください。 (これについては多くの良いチュートリアルがありますので、詳しくは触れません)
  2. レールコンソールに入り、コントローラクラスをロードしてください。動作しない場合は、構文上のバグを発見した可能性があります。 Api::V2::CampaignsControllerをロードしようとしたときに、コンソールで何が起こったのですか?

    のirb>アピ:: V2 :: CampaignsController

    => CampaignsController

注:Railsの間違ったコントローラへのすべての要求を指示された(コントローラクラスをロードするために、Railsの空想の論理に基づきます) 。 Api :: V2 :: CampaignsControllerに移動する必要がありますが、代わりにCampaignsControllerがロードされています。

あなたはまたしてコンソールでそれを確認することができます。これは、私は、APIから延びるれたクラスの構文の問題になってしまっ

> app.get '/api/v2/campaigns.json' 
> app.controller.class 
=> CampaignsController 
# This is not the expected controller. 

:: V2 :: CampaignsController。

これはちょっと心配でしたが、これが他の人に役立つことを願っています。

関連する問題