14

私が見るすべての例で、人々は巨大な api.rb ファイルを 1 つしか実装していません。元:

このアプローチはそのままでも問題なく機能しますが、すぐに混雑して維持が困難になる可能性があるため、アプリで分割したいと考えています。

たとえば、エンティティをリソースから分割してから、リソースを異なるファイルに分割したいと考えています。例えば:

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 のクラスは、API ではなく Post にする必要があります。その後、Post API をクラス 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 に答える