1

使用Rails 3.0.7,我創建了我們的應用程序的API,而且我有這樣的設置:嵌套命名路線將錯誤控制器

的routes.rb

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 

然後,我有我經常app/controllers/application_controller.rbapp/controllers/users_controller.rb文件,以及那些像我的定義和app/controllers/api/v1/application_controller.rb文件app/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 

而且everythi前ng似乎正在工作,直到我覆蓋由UsersController和Api :: V1 :: UsersController共享的方法 - 現在看起來好像所有內容都指向UsersController,即使我通過api/v1/users訪問路線。

我在我的智慧結尾試圖弄清楚。有什麼建議麼?謝謝。 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. 運行bundle exec rake routes來生成什麼路由鏈接到什麼控制器和動作的列表。如果這是好的,則轉到步驟2.如果不是,請修復您的路線文件,然後重試。 (關於這方面的很多好教程,所以我不會詳細討論)
  2. 進入rails控制檯,並加載控制器類。如果它不起作用,您可能已經發現了語法錯誤。以下是我在試圖加載Api::V2::CampaignsController時在控制檯上發生的情況。

    IRB>阿比:: V2 :: CampaignsController

    => CampaignsController

注:(基於Rails的花式邏輯加載控制器類)的Rails被引導到錯誤的控制器的所有請求。它應該轉到Api :: V2 :: CampaignsController,但它正在加載CampaignsController。

您也可以驗證它在控制檯:

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

這結束了在我從API :: V2 :: CampaignsController擴展一個類有語法問題。

這有點令人難以置信,但希望這可以幫助別人。