为什么尝试将 Grape 与 Rails 一起使用会因“未初始化常量 API”而失败?

2023-11-29

我希望有人解释一下为什么在 Rails (4.1.8) 和 Grape (0.10.1) 中会发生这种情况

这是我的 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与上面相同

then 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

and config/application.rb与上面相同

然后一切正常。

我的问题是为什么我不需要在里面指定模块v1/root.rb还有里面v1/users以及为什么我不需要使用API::Root => '/' in config/routes.rb?


这是因为app/api是 API 类的顶级文件夹,而不是app.

From 葡萄的文档:

将 API 文件放入app/api。 Rails 需要一个与 Ruby 模块名称匹配的子目录以及与类名称匹配的文件名。在我们的示例中,文件名位置和目录为Twitter::API应该app/api/twitter/api.rb.

因此,正确的位置API::Root类实际上是app/api/api/root.rb, not /app/api/root.rb——尽管如此is顶级命名空间中类的正确位置,这就是为什么您给出的第二个示例(从API模块)有效。

不过,我建议您将 API 类放在自己的模块中,并将它们移动到下面的匹配子文件夹中app/api.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么尝试将 Grape 与 Rails 一起使用会因“未初始化常量 API”而失败? 的相关文章

随机推荐