Skip to main content

advanced_content_negotiation

🌐 Advanced Content Negotiation with Custom Responders

Create a custom responder to DRY up respond_to logic across controllers. Handle JSON, XML, or custom MIME types, enforce API versioning, and provide consistent fallback behavior when formats aren’t supported.

# app/responders/api_responder.rb
class ApiResponder < ActionController::Responder
def to_json
controller.render(json: resource, status: default_status)
end

def api_error
controller.render(json: { error: resource.errors }, status: :unprocessable_entity)
end
end

# app/controllers/application_controller.rb
class ApplicationController < ActionController::API
self.responder = ApiResponder
respond_to :json
end