Rails Grape,DRY Helpers呼吁共享params

时间:2014-11-10 22:57:53

标签: ruby-on-rails ruby helpers grape-api

目标:使用helper模块中的grape Shared Params,而不必在每个已安装的API上添加语法helpers Helper::Module

有效的示例代码:

# /app/api/v1/helpers.rb
module V1
  module Helpers
    extend Grape::API::Helpers

    params :requires_authentication_params do
      requires :user_email,           type: String
      requires :authentication_token, type: String
    end
  end
end

# /app/api/api.rb
class API < Grape::API
  format :json
  version 'v1', using: :path

  mount V1::A
  mount V1::B
end

# /app/api/v1/a.rb
module V1
  class A < Grape::API
    helpers V1::Helpers

    desc 'SampleA'
    params do
      use :requires_authentication_params
    end
    get 'sample_a/url' do
      #...
    end
  end
end

# /app/api/v1/B.rb
module V1
  class B < Grape::API
    helpers V1::Helpers

    desc 'SampleB'
    params do
      use :requires_authentication_params
    end
    get 'sample_b/url' do
      #...
    end
  end
end

当我尝试将helpers V1::Helpers来自AB的呼叫移至安装它们的API类时,会出现问题,抛出异常:

block (2 levels) in use': Params :requires_authentication_params not found! (RuntimeError)

作为一个有趣的说明,该模块确实包含在内,因为如果我向类V1::Helpers添加任何实例方法,我可以在AB中使用它们。

所以问题是,干燥这个并遵循最佳实践的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:0)

如果您在V1::Helpers上加API,然后从A继承BAPI,该怎么办?例如:

# /app/api/api.rb
class API < Grape::API
  include V1::Helpers

  format :json
  version 'v1', using: :path

  mount V1::A
  mount V1::B
end

class A < API
  # ...
end

class B < API
  # ...
end