2013-02-13 31 views
14

在我看到的每個例子中,人們只實現了一個巨大的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應該工作:)

+1

如果我有另一個版本的API - v2並且我想要公開不同的屬性內容名稱,那麼假設我將擁有'''expose:body'''而不是''''expose:content '''與此同時我仍然需要支持v1。我想我會開始將實體放入版本文件夾中,對嗎?或者你會如何處理這個設置? – 2015-01-16 01:59:35

回答

7

post.rb中的類應該是Post,而不是API。然後,您可以在類API中安裝Post API。

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

爲了避免混淆,我也將Post放在Resources命名空間中,或者將其重命名爲PostAPI。

+0

非常感謝@dB。事實上,你必須爲命名空間進行命名空間和重命名,以避免混淆......現在就開始工作吧! – X2theZ 2013-02-13 18:29:18

+0

請注意,您應該可以省略'mount'的右側,所以只需'mount Blog :: Resources :: PostAPI'應該可以工作,不需要掛載在'/'上。 – 2013-02-13 19:28:36

1

我發現它不工作的路徑前綴:

mount Blog::Post => '/blog' 

,如果你想有前綴的路徑是行不通的。

使用

namespace :blog do 
    mount Blog::Post 
end 

希望它能幫助!