Наследование не работает в винограде

Я использую виноградный редтфул-апи. Я не могу наследовать common_params в Grape. Я определил общие _params в классе API1 и вызвал его в API2, выдает ошибку. Как я могу изменить код, чтобы это работало?

module Example
  class API1 < Grape::API
    version 'v1'
    format :json
    prefix :api

    resource :exc1 do
      common_params = proc do
        requires :param1
        requires :param2
      end

      params(&common_params)
      get :params_by_pair do
        p1 = params[:param1]
        p2 = params[:param2]
        response = "https://www.example1.com/#{p1}_#{p2}"
      end
    end
  end
end

module Example
  class API2 < API1
    version 'v1', using: :header, vendor: 'twitter'
    format :json
    prefix :api

    resource :exc2 do

      params(&common_params)
      get :params_by_pair do
        p1 = params[:param1]
        p2 = params[:param2]
        response = "https://www.example2.com/#{p1}_#{p2}"
      end
    end
  end
end

person Sam    schedule 09.01.2015    source источник


Ответы (1)


Проблема связана не с Grape, а с тем, как область видимости переменных работает в Ruby. common_params - это просто локальный объект, он не переживет конец области видимости. Вы можете заставить его работать, используя переменную экземпляра класса или похоже, но не будем об этом. Способ, которым вы должны делиться помощниками в разных сортах винограда, — через специальный модуль.

module Example
  module SharedHelpers
    extend Grape::API::Helpers

    params :common_params do
      requires :param1
      requires :param2
    end
  end
end

А теперь в разные виноградины нужно "включить" модуль и use хелпер.

module Example
  class API1 < Grape::API
    helpers SharedHelpers # !!!

    version 'v1'
    format :json
    prefix :api

    resource :exc1 do
      params do
        use :common_params # !!!
      end

      get :params_by_pair do
        ...
      end
    end
  end
end

Чтобы использовать помощников в виноградине API2, используйте ту же технику.

person Jiří Pospíšil    schedule 09.01.2015