我希望有人解释为什么在Grape(0.10.1)的Rails(4.1.8)中会发生这种情况
所以这是我的API:
app/api/root.rb
:
module API
class Root < Grape::API
prefix 'api'
mount API::V1::Root
end
end
app/api/v1/root.rb
:
module API::V1
class Root < Grape::API
version 'v1'
mount API::V1::Users
end
end
app/api/v1/users.rb
:
module API::V1
class Users < Grape::API
format 'json'
resource :users do
desc "Return list of users"
get '/' do
User.all
end
end
end
end
config/routes.rb
:
Rails.application.routes.draw do
mount API::Root => '/'
end
在我中,application.rb
我补充说:
config.paths.add "app/api", glob: "**/*.rb"
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
在这种情况下,我得到了错误: NameError: uninitialized constant API
但是如果我的代码看起来像:
app/api/root.rb
同上
然后app/api/v1/root.rb
:
class Root < Grape::API
version 'v1'
mount Users
end
app/api/v1/users.rb
:
class Users < Grape::API
format 'json'
resource :users do
desc "Return list of users"
get '/' do
User.all
end
end
end
config/routes.rb
:
Rails.application.routes.draw do
mount Root => '/'
end
和config/application.rb
上面一样
然后,一切正常。
我的问题是,为什么我不需要在内部v1/root.rb
和内部都指定模块v1/users
,为什么也不需要API::Root => '/'
在in中使用config/routes.rb
?
这是因为它app/api
是API类的顶级文件夹,而不是app
。
根据Grape的文档:
将API文件放入
app/api
。Rails需要一个与Ruby模块名称匹配的子目录,以及一个与类名称匹配的文件名。在我们的示例中,的文件名位置和目录Twitter::API
应为app/api/twitter/api.rb
。
因此,一个API::Root
类的正确位置实际上app/api/api/root.rb
不是,/app/api/root.rb
尽管这是顶级命名空间中该类的正确位置,这就是您给出的第二个示例(从API
模块中删除了类)起作用的原因。
不过,我建议您将API类放在各自的模块中,然后将其移动到下方的匹配子文件夹中app/api
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句