0

私はAPIを構築しています:

  • ルビー2.2
  • レール 4.2.6
  • ぶどう宝石 0.16.2
  • active_model_serializers-gem 0.10.2
  • grape-active_model_serializers-gem (マスターから 1.4)

ここで説明されているように、API バージョニングを導入しようとするまで、私の JSON シリアライザーはうまく機能します: https://github.com/ruby-grape/grape-active_model_serializers

バージョン管理されていないシリアライザー:

class SignupSerializer < ActiveModel::Serializer
  attributes :id, :comments, :pending
end

バージョン管理されたシリアライザー:

module Mobile
  module V1
    class SignupSerializer < ActiveModel::Serializer
      attributes :id, :comments, :pending
    end
  end
end

エラーメッセージは次のとおりです。

LoadError (定数 SignupSerializer を自動ロードできません。定義するには /Users/username/GitHub/AppName/app/serializers/mobile/v1/signup_serializer.rb が必要です): app/api/mobile/logger.rb:16:in block in call' app/api/mobile/logger.rb:15:incall'

API 組織:

ここに画像の説明を入力

base.rb:

require 'grape-swagger'

module Mobile
  class Dispatch < Grape::API
    mount Mobile::V1::Root
    mount Mobile::V2::Root
    format :json
    route :any, '*path' do
      Rack::Response.new({message: 'Not found'}.to_json, 404).finish
    end
    add_swagger_documentation
  end

  Base = Rack::Builder.new do
    use Mobile::Logger
    run Mobile::Dispatch
  end
end

v1/root.rb:

module Mobile
  module V1
    class Root < Dispatch
      format :json
      formatter :json, Grape::Formatter::ActiveModelSerializers
      version 'v1'
      default_error_formatter :json
      content_type :json, 'application/json'
      use ::WineBouncer::OAuth2

      rescue_from :all do |e|
        eclass = e.class.to_s
        message = "OAuth error: #{e.to_s}" if eclass.match('WineBouncer::Errors')
        status = case 
        when eclass.match('OAuthUnauthorizedError')
          401
        when eclass.match('OAuthForbiddenError')
          403
        when eclass.match('RecordNotFound'), e.message.match(/unable to find/i).present?
          404
        else
          (e.respond_to? :status) && e.status || 500
        end
        opts = { error: "#{message || e.message}" }
        opts[:trace] = e.backtrace[0,10] unless Rails.env.production?
        Rack::Response.new(opts.to_json, status, {
          'Content-Type' => "application/json",
          'Access-Control-Allow-Origin' => '*',
          'Access-Control-Request-Method' => '*',
        }).finish
      end

      mount Mobile::V1::Me
      mount Mobile::V1::Events
      mount Mobile::V1::Signups

      route :any, '*path' do
        raise StandardError, 'Unable to find endpoint'
      end
    end
  end
end

API/v1/signup.rb:

module Mobile
  module V1
    class Signups < Mobile::V1::Root
      include Mobile::V1::Defaults

      resource :signups, desc: 'Operations about the signups' do

        desc "Returns list of signups"
        oauth2 # This endpoint requires authentication

        get '/' do
          Signup.where(pending: false)
        end

      end

    end

  end
end

何か案は?

4

1 に答える 1

0

gem のメンテナーは、この問題の更新に取り組んでいます。更新は、リポジトリからダウンロードできます。

https://github.com/ruby-grape/grape-active_model_serializers/issues/55

于 2016-07-22T10:08:30.180 に答える