嵌套命名空间的路线将错误控制器(nested namespace route going to wr

2019-07-29 06:39发布

使用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.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和AP​​I :: V1 :: UsersController共享的方法是正确的工作 - 现在好像一切都指向UsersController即使我通过API / V1访问/用户的路线。

我在我束手无策试图弄明白。 有什么建议? 谢谢。 PS - 随时与任何约定,我忽略了我不应该或其他东西我可能会搞砸了:)发表评论

Answer 1:

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


Answer 2:

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

  1. 运行bundle exec rake routes产生什么路线链接的列表,以什么样的控制器和行动。 如果这是很好的,然后移动到第2步。如果不是,解决您的路线文件,然后再试一次。 (许多好的教程这一点,所以我不会细讲)
  2. 进入轨道控制台,只需加载控制器类。 如果它不工作,你可能已经发现在语法上的错误。 这里就是发生在控制台上,当我试图加载Api::V2::CampaignsController

    IRB>阿比:: V2 :: CampaignsController

    => CampaignsController

注意:导轨是指导到错误的控制器的所有请求(基于Rails的花式逻辑加载控制器类)。 它应该转到阿比:: V2 :: CampaignsController,而是它加载CampaignsController。

您也可以验证它与控制台:

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

这结束了在我从API :: V2 :: CampaignsController扩展一个类有语法问题。

这是一个有点令人难以置信,但希望这可以帮助别人。



文章来源: nested namespace route going to wrong controller