Как разбить вещи в приложении api grape? - программирование
Подтвердить что ты не робот

Как разбить вещи в приложении api grape?

В каждом примере, который я вижу, люди реализуют только один гигантский файл 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


РЕШЕНИЕ (благодаря дБ и моим сотрудникам)

Вам нужно изменить структуру на что-то вроде:

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 должен работать:)

4b9b3361

Ответ 1

Класс в post.rb должен быть Post, а не API. Затем вы можете подключить Post API внутри API класса.

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

Чтобы избежать путаницы, я бы поставил Post в пространство имен Resources или переименовал его в PostAPI.

Ответ 2

Я нашел, что он не работает для префикса пути:

mount Blog::Post => '/blog'

не работает, если вы хотите иметь префикс пути.

использование

namespace :blog do
   mount Blog::Post
end

Надеюсь, что это поможет!