14

在我看到的每个示例中,人们只实现了一个巨大的 api.rb 文件。前任:

虽然这种方法可以正常工作,但它很快就会变得拥挤且难以维护,所以我想在我的应用程序上拆分内容。

例如,我想从我的资源中拆分我的实体,然后在不同的文件之间拆分我的资源。举些例子:

app
 - api
   api.rb
   - entities
     - weblog.rb
     - post.rb
     - comment.rb
   - resources
     - weblog.rb
     - post.rb
     - comment.rb

现在,api.rb将类似于:

require 'grape'
module Blog
  class API < Grape::API
    prefix "api"
  end
end

app/api/entities/post.rb将类似于:

module Blog
  module Entities
    class Post < Grape::Entity
      root 'posts', 'posts'
      expose :id
      expose :content
    end
  end
end

app/api/resources/post.rb将类似于:

module Blog
  class API < Grape::API
    resource :posts do
      get do
        present Post.all, with: Blog::Entities::Post
      end

      desc "returns the payment method corresponding to a certain id"
      params do
        requires :id, :type => Integer, :desc => "Post id."
      end
      get ':id' do
        present Post.find(params[:id]), with: Blog::Entities::Post
      end
    end
  end
end

当我们这样做时,我们会遇到以下消息:

预期 /blog-app/api/resources/post.rb 来定义 Post


解决方案(感谢 dB。和我的同事)

您必须将结构更改为:

app
 - api
   api.rb
   - resources
     - post_api.rb

然后,在post_api.rb

module Blog
  class Resources::PostAPI < Grape::API
    resource :posts do
      get do
        present Post.all
      end
    end
  end
end

最后,api.rb变为:

require 'grape'
module Blog
  class API < Grape::API
    prefix 'api'
    version 'v1', :using => :path
    format :json

    mount Blog::Resources::PostAPI => '/'
  end
end

现在/api/v1/posts应该工作:)

4

2 回答 2

7

post.rb 中的类应该是 Post,而不是 API。然后你可以在类 API 中挂载 Post API。

class API < Grape::API
  mount Blog::Post => '/'
end

为避免混淆,我也会将 Post 放在 Resources 命名空间中,或者将其重命名为 PostAPI。

于 2013-02-13T17:35:26.310 回答
1

我发现它不适用于路径前缀:

mount Blog::Post => '/blog'

如果您想为路径添加前缀,则不起作用。

采用

namespace :blog do
   mount Blog::Post
end

希望能帮助到你!

于 2013-12-23T16:34:52.650 回答