Weniger Abstraktion ist manchmal mehr

Zunächst war ich kritisch: Kann ein Konferenzbeitrag über Routing-Ansätze brauchbare Erkenntnisse bieten? Schlussendlich ist das Routing ein sehr kleiner Teil und Rails liefert einen funktionierenden Ansatz mit. Performance-Sprünge im gesamten Kontext sind nicht zu erwarten.

Interessant finde ich aber, wie durch das Entfernen der Abstraktion zwischen Router und Controller wesentliche Konzepte vereinfacht werden können. So lassen sich die unschönen Before-Action-Hooks samt Only-Beschränkungen viel eleganter ausdrücken:

route.is 'users' do
  authorize_user_session!

  route.get do
    @users = User.all
    view(:index)
  end

  route.is ':id' do |id|
    @user = User.find(id)
    
    route.get do
      view(:edit)
    end
    
    route.post do
      @user.update(params[:user])
      redirect_to action: :show
    end
  end
end

Dieser verschachtelte Ansatz erlaubt einen intuitiveren Blick auf das Geschehen, als es beispielsweise bei stark getrennten Ansätzen wie Rails der Fall ist:

# Routes

resouces :users, only: [:index, :show, :update]

# UsersController

before_action :authorize_login
before_action :assign_user, only: [:show, :update]

def index
  @users = User.all
end

def edit
end

def update
  @user.update(params[:user])
  redirect_to action: :show
end

private

def assign_user
  @user = User.find(params[:id])
end

Wer sich für einen solchen Routing-Tree-Ansatz interessiert, sollte sich einmal Roda ansehen.