Idealerweise funktioniert eine Website in jedem Browser, und sei es, indem man für sehr alte Browser eine weniger aufwendige Variante bietet (graceful degradation). Manchmal möchte man aber doch bestimmt Browser ausschließen. In Ruby on Rails verwendete man dazu typischerweise Gems wie browser. Darauf konnte man eine Browser-Erkennung aufbauen, nach dem Prinzip

<% if browser.ie?(6) %>
  <p class="disclaimer">Bitte einen moderneren Browser verwenden!</p>
<% end %>

Seit Version 7.2 bringt Ruby on Rails einen vergleichbaren Mechanismus direkt mit, in Form von allow_browser. Diese Methode wird im Controller verwendet, zum Beispiel in der Form

class ApplicationController < ActionController::Base
  allow_browser versions: :modern
end

Mit dieser Einstellung erlaubt die App “moderne” Browser. Darunter versteht Rails aktuell

  • Safari ab v17.2
  • Chrome ab v120
  • Firefox ab v121
  • Opera ab v106
  • Internet Explorer in keiner Version

Besucht man die App in einem nicht unterstützten Browser, wird man auf public/406-unsupported-browser.html umgeleitet, mit dem HTTP response code 406 Not Acceptable.

Vieles davon lässt sich anpassen. Beispielsweise kann man anstelle des Schlüsselworts modern einen Hash mit den gewünschten Mindestversionen übergeben:

allow_browser versions: { safari: 16.4, firefox: 121, ie: false} # false bedeutet, in keiner Version akzeptiert

Oder man definiert die gewünschte Reaktion und den response code:

allow_browser versions: :modern, block: :handle_outdated_browser

private

def handle_outdated_browser
  render file: Rails.root.join('public/error_outdated_browser.html'), status: :not_acceptable
end

Wenn man allow_browser zentral im ApplicationController einbaut, wird der Browser bei allen Endpunkten überprüft. Es geht aber auch spezifisch für einen Controller oder nur bestimmte Endpunkte:

class ArticleController < ApplicationController
  allow_browser versions: { safari: 16.4, firefox: 121, ie: false}, only: :show
end

Und schon sind zu alte Browser von articles#show ausgeschlossen.