2015-01-09 75 views
3

我正在使用grape redtful-api。我無法繼承葡萄中的common_params。我在類API1中定義了通用的 _params,並在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葡萄的助手,使用相同的技術。