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