【发布时间】:2019-07-15 19:04:29
【问题描述】:
我在我的 config/initializers 中使用以下内容制作了一些嵌套路由文件:
class ActionDispatch::Routing::Mapper
def draw(routes_name, sub_path=nil)
if sub_path.present?
instance_eval(File.read(Rails.root.join("config/routes/#{sub_path}/#{routes_name}.rb")))
else
instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
end
end
end
但是,当在路由文件中这样使用时:
Rails.application.routes.draw do
scope :api do
["v1"].map { |version| draw :base, "api/" + version }
end
end
那里的路由没有嵌套为api/users 等。不知道为什么范围在那里被忽略。
编辑:更详细的示例
routes.rb
namespace :api, defaults: { format: :json } do
Rails.application.routes.draw do
["v1"].map { |version| draw :base, "api/" + version }
end
end
base.rb
namespace :v1 do
Rails.application.routes.draw do
[:identity].map { |path| draw path, "api/v1"}
end
end
身份.rb
Rails.application.routes.draw do
# Ensures proper namespace when fetching controllers, but does not add to path for routes
scope module: :identity do
namespace :users do
put '/', action: :update
patch '/', action: :update
get 'user_from_token', action: :update
end
end
end
【问题讨论】:
-
它似乎在我的电脑上工作
~/projects/sandbox/rcomments$ cat config/routes/api/v1/base.rb get '/foobar', to: 'users#index' resources :bars~/projects/sandbox/rcomments$ rake routes [...] GET /api/foobar(.:format) POST /api/bars(.:format) GET /api/bars/new(.:format) GET /api/bars/:id/edit(.:format) GET /api/bars/:id(.:format) [...]你是如何声明你的嵌套路由的? -
@sigmaray 路由文件在上面。
draw :base调用未在scope :api下返回。对rails routes的调用将这些路由显示为根级路由,而不是api/...。 -
可以分享
config/routes/api/v1/base.rb的内容吗?将get '/foobar', to: 'users#index'resources :bars放入此文件对我有用,它生成了正确范围内的路由(/api/foobar,api/bars) -
@sigmaray 在上面添加。我的实际嵌套双深,但 api 和 v1 似乎都没有作为我的路由或命名空间控制器的前缀。
标签: ruby-on-rails ruby routes ruby-on-rails-5.2