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.