嵌套命名空间路由转向错误的控制器

使用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 eg 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.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  [:show, :update, :delete] end 

在一切似乎工作正常之前,我覆盖了一个由UsersController和Api :: V1 :: UsersController共享的方法 – 现在好像所有东西都指向UsersController,即使我通过api / v1访问/ users route。

我正在努力解决这个问题。 有什么建议? 谢谢。 PS – 随意评论我无视任何惯例,我不应该或其他我可能搞砸了:)

skip_before_filter也是一般的skip_before_filterfilter的符号参数,而不是你想要跳过的符号参数。 只要应用了正确的作用域/命名空间,控制器名称就不必是唯一的。

  • 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 

Rails有点令人困惑,但我遇到了类似的问题。 以下是您可以采取的一些步骤,以确保您不会错过任何小代码问题。 (这最终导致我发现命名空间控制器中的语法错误)。

  1. 运行bundle exec rake routes以生成链接到哪个控制器和操作的路由列表。 如果这样做很好,那么请转到步骤2.如果没有,请修复您的路线文件,然后重试。 (很多很好的教程,所以我不会详细介绍)
  2. 进入rails控制台,只需加载控制器类。 如果它不起作用,您可能发现了语法错误。 这是我尝试加载Api::V2::CampaignsController时在控制台上发生的事情。

    irb> Api :: V2 :: CampaignsController

    => CampaignsController

注意:Rails将所有请求定向到错误的控制器(基于Rails的奇特逻辑来加载控制器类)。 它应该转到Api :: V2 :: CampaignsController,但它正在加载CampaignsController。

您还可以在控制台中使用以下命令进行validation:

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

这最终成为我从Api :: V2 :: CampaignsController扩展的类中的语法问题。

这有点令人难以置信,但希望这有助于其他人。