3

我正在用 Grape 编写一个 API,但它是独立的,没有 Rails 或 Sinatra 或任何东西。我想将app.rb文件拆分为单独的文件。我看过How to split things in a grape api app? ,但那是在 Rails 中。

我不确定如何使用模块或类进行这项工作——我确实尝试将不同的文件子类化到我的 bigGrapeApp中,但这很丑,我什至不确定它是否能正常工作。最好的方法是什么?

我目前有按文件夹( , 等)拆分的版本v1v2但仅此而已。

4

1 回答 1

6

你不需要从你的主应用子类化,你可以在主应用程序中安装单独的 Grape::API 子类。当然,您可以在单独的文件中定义这些类,并使用它require来加载您的应用程序可能需要的所有路由、实体和助手。我发现为每个“域对象”创建一个迷你应用程序并将其加载到 中很有用app.rb,如下所示:

  # I put the big list of requires in another file . . 
  require 'base_requires'

  class MyApp < Grape::API
    prefix      'api'
    version     'v2'
    format      :json

    # Helpers are modules which can have their own files of course
    helpers APIAuthorisation

    # Each of these routes deals with a particular sort of API object
    group( :foo ) { mount APIRoutes::Foo }
    group( :bar ) { mount APIRoutes::Bar }
  end

我相当随意地将文件排列在文件夹中:

# Each file here defines a subclass of Grape::API
/routes/foo.rb 

# Each file here defines a subclass of Grape::Entity
/entities/foo.rb

# Files here marshal together functions from gems, the model and elsewhere for easy use
/helpers/authorise.rb

我可能会模仿 Rails 并有一个/models/文件夹或类似的文件夹来保存 ActiveRecord 或 DataMapper 定义,但碰巧在我当前的项目中以不同的模式为我提供了它。

我的大部分路由看起来都很基础,它们只是调用一个相关的辅助方法,然后基于它呈现一个实体。例如/routes/foo.rb,可能看起来像这样:

module APIRoutes
  class Foo < Grape::API
    helpers APIFooHelpers

    get :all do
      present get_all_users_foos, :with => APIEntity::Foo
    end

    group "id/:id" do
      before do
        @foo = Model::Foo.first( :id => params[:id] )
        error_if_cannot_access! @foo
      end

      get do
        present @foo, :with => APIEntity::Foo, :type => :full
      end

      put do
        update_foo( @foo, params )
        present @foo, :with => APIEntity::Foo, :type => :full
      end

      delete do
        delete_foo @foo
        true
      end
    end # group "id/:id"
  end # class Foo
end # module APIRoutes
于 2013-07-12T21:51:11.613 回答