在我看到的每個例子中,人們只實現了一個巨大的api.rb文件。例如:如何在葡萄api應用程序中分割東西?
雖然這種方法細如,它可以迅速變得擁擠,難以維持,所以我想的東西拆了我應用程序。
例如,我想從我的資源中分割我的實體,然後在不同文件之間分割我的資源。對於例子:現在
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
應用程序/ API /實體/ 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定義後
解決方案(感謝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
應該工作:)
如果我有另一個版本的API - v2並且我想要公開不同的屬性內容名稱,那麼假設我將擁有'''expose:body'''而不是''''expose:content '''與此同時我仍然需要支持v1。我想我會開始將實體放入版本文件夾中,對嗎?或者你會如何處理這個設置? – 2015-01-16 01:59:35