ruby-on-rails-3 - 如何在葡萄 api 应用程序中拆分东西?

标签 ruby-on-rails-3 api grape-api

在我看到的每个例子中,人们只实现了一个巨大的 api.rb 文件。前任:

  • intridea/grape
  • bloudraak/grape-sample-blog-api
  • djones/grape-goliath-example

  • 虽然这种方法按原样运行良好,但它很快就会变得拥挤且难以维护,因此我想在我的应用程序上拆分内容。

    例如,我想从我的资源中拆分我的实体,然后在不同的文件之间拆分我的资源。举些例子:
    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
    

    当我们这样做时,我们会遇到以下消息:

    Expected /blog-app/api/resources/post.rb to define 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。

    关于ruby-on-rails-3 - 如何在葡萄 api 应用程序中拆分东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857987/

    相关文章:

    ruby-on-rails - 使用葡萄实体将参数传递给模型方法

    ruby-on-rails - Rails Grape API 'id is invalid' 在不需要 id 的请求中

    ruby-on-rails - Ruby 中的 `try` 和 `&.`(安全导航运算符)有什么区别

    ruby-on-rails-3 - Rails 3 - .Nil?重定向不起作用

    ruby-on-rails-3 - 使用ubuntu在monit下运行delayed_job

    ruby-on-rails - 如何为类中的特定方法连接到不同的数据库?

    ruby-on-rails - ruby json新换行符渲染格式不正确

    python - 处理命令行参数和/或 api 方法参数的模式

    ruby-on-rails-3 - 链接到(:controller= >"something") helper + Devise doesn't work properly

    Java 流处理与 if/检查流状态