Using helper methods and helper modules in Rails Grape to keep the code DRY
I was working with a Grape API and got into a situation where I was kind of reimplementing some methods on more than one mounted API. So naturally, I wanted to refactor the code, keep it DRY and extract it as helper methods and eventually into helper module.
So here is what my base API class looks like:
# /app/api/api.rb class API < Grape::API format :json version 'v1', using: :path mount V1::A mount V1::B end
and here goes my helper module, nothing fancy, just pretty basic stuff:
# /app/api/v1/helpers/authentication_helpers.rb module V1 module Helpers module AuthenticationHelpers extend Grape::API::Helpers def current_operator @current_operator ||= authenticate! end def authenticate! # Handle the authentication stuff end end end end
So now we have our AuthenticationHelpers available, we can just go ahead and include them in any or every API that is mounted.
Loading helpers for every mounted API
We can include and load our AuthenticationHelper across all the mounted APIs by just including them in our base class and then making all other classes inherit from the base class API.
# /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
Loading helpers for a single mounted API
If we just want to include our AuthenticationHelper for one or two APIs only, we can go ahead and just include them on the individual classes.
# /app/api/v1/a.rb module V1 class A < Grape::API helpers V1::Helpers # ... end end # /app/api/v1/B.rb module V1 class B < Grape::API helpers V1::Helpers #... end end