Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thegedge/0d5ac8ff9364f2739da0c96a913efb6e to your computer and use it in GitHub Desktop.
Save thegedge/0d5ac8ff9364f2739da0c96a913efb6e to your computer and use it in GitHub Desktop.
Rails versioned controllers via Accept header
class V1::WelcomeController < V1::ApplicationController
def index
respond_to do |format|
format.welcome { render plain: "testing v1" }
end
end
end
class V2::WelcomeController < V1::ApplicationController
def index
respond_to do |format|
format.welcome { render plain: "now working with v2" }
end
end
end
Mime::Type.register "application/vnd.welcome.v1", :welcome, ["application/vnd.welcome.v2"]
class VersionConstraint
def initialize(version, default = false)
@version = version
@default = default
end
def matches?(request)
# TODO use existing MIME type parsing code
@default || request.headers['Accept'].include?("application/vnd.welcome.v#{@version}")
end
end
Rails.application.routes.draw do
def versioned(versions)
last = versions.last
versions.each do |version|
version_module = "v#{version}".to_sym
scope module: version_module, constraints: VersionConstraint.new(version, version == last) do
yield
end
end
end
versioned(1..2) do
get 'test', to: 'welcome#index'
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment