Ruby on rails 带命名空间的Rails 3路由
当尝试访问以下URL时,我得到一个404错误页面: dev.mydomain.com/api 然而,my routes.rb文件提到此路由确实存在: routes.rb 耙道 控制器 /app/controllers/developers/apidoc/main_controller.rbRuby on rails 带命名空间的Rails 3路由,ruby-on-rails,ruby-on-rails-3,routing,namespaces,routes,Ruby On Rails,Ruby On Rails 3,Routing,Namespaces,Routes,当尝试访问以下URL时,我得到一个404错误页面: dev.mydomain.com/api 然而,my routes.rb文件提到此路由确实存在: routes.rb 耙道 控制器 /app/controllers/developers/apidoc/main_controller.rb class Developers::Apidoc::MainController < Developers::BaseController def index end end 我猜问题是您的路
class Developers::Apidoc::MainController < Developers::BaseController
def index
end
end
我猜问题是您的路径指向
api/developers/apidoc/main
,但您的类只是developers::apidoc::MainController
。您不应该使用api
为该路由命名,也不应该将api添加到控制器的名称空间-api::Developers::Apidoc::MainController
另一个需要记住的重要因素是路由名称空间需要伴随目录路径才能保持一致。出错还会导致如下错误:
Routing Error
uninitialized constant Api::Developers
namespace "api" do
namespace "developers" do
...
end
end
在我的例子中,我有这样一个路由结构:
Routing Error
uninitialized constant Api::Developers
namespace "api" do
namespace "developers" do
...
end
end
文件夹/目录结构应该是app/controllers/api/developers/TL;DR将
命名空间
替换为范围
给定以下文件夹结构
Rails.root
|
+-- app/
| |
| +-- controllers/
| |
| +-- jobs_controller.rb
+-- config/
|
+-- routes.rb
下面routes.rb中的代码段给出了一个错误ActionController::RoutingError:uninitialized constant Api:
namespace :api do
namespace :v1 do
resources :jobs
end
end
而以下工作:
scope :api do
scope :v1 do
resources :jobs
end
end
原因简述如下:
命名空间范围将自动添加:以及
:模块
和:路径
前缀
事实上,名称空间只是范围的包装器,包含一系列预定义选项:
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 871
def namespace(path, options = {})
path = path.to_s
defaults = {
module: path,
path: options.fetch(:path, path),
as: options.fetch(:as, path),
shallow_path: options.fetch(:path, path),
shallow_prefix: options.fetch(:as, path)
}
scope(defaults.merge!(options)) { yield }
end
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 871
def namespace(path, options = {})
path = path.to_s
defaults = {
module: path,
path: options.fetch(:path, path),
as: options.fetch(:as, path),
shallow_path: options.fetch(:path, path),
shallow_prefix: options.fetch(:as, path)
}
scope(defaults.merge!(options)) { yield }
end