2015-01-09 3 views
3

Я использую виноград redtful-api. Я не могу наследовать 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 

ответ

1

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

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 винограде, использует ту же технику.