X2t*_*heZ 14 api ruby-on-rails-3 grape-api
在我看到的每个例子中,人们只实现了一个巨大的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应该工作:)
post.rb中的类应该是Post,而不是API.然后,您可以在类API中安装Post API.
class API < Grape::API
  mount Blog::Post => '/'
end
为了避免混淆,我也将Post放在Resources命名空间中,或者将其重命名为PostAPI.
| 归档时间: | 
 | 
| 查看次数: | 4931 次 | 
| 最近记录: |