Richtiges Routing für kurze URL nach Benutzername in Rails

Ich versuche, Benutzerprofilansichten dieser Art zu ersetzen

/users/1

mit

/username

Ich bin mir bewusst, dass dies bedeutet, dass ich nach Kollisionen verschiedener Art suchen muss. Ich habe die folgenden ähnlichen SO-Fragen konsultiert:

Ruby on Rails Routing mit passendem BenutzernamenPassen Sie die Rails-URL mit dem Benutzernamen anRouting in Rails macht den Benutzernamen zu einer URL:Routing-Fehler mit: Benutzername in URL

Hier sind die verschiedenen fehlgeschlagenen routendefinitionen für routes.rb und die damit verbundenen Fehler:

match "/:username" => "users#show", via: "get"

Hier ist der Fehler:

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User without an ID

app/controllers/users_controller.rb:7:in `show'

Hier ist mein entsprechender users_controller:

6 def show
7   @user = User.find(params[:id])
8 end

match "/:username" => 'users#show', :as => :profile

Gleicher Fehler wie oben.

match "/:username", :controller => "users/:id", :action => 'show'

 Routing Error

 uninitialized constant Users

 Try running rake routes for more information on available routes.

match '/:username', :controller => 'users', :action => 'show'

Gleicher Fehler wie 1.

match '/:username', to: 'users/:id', via: 'show'

Server startet nicht.

match "/:username" => redirect("/users/:id")

Error:

 ActiveRecord::RecordNotFound in UsersController#show

 Couldn't find User with id=:id

Haben Sie eine Idee, warum mein Routing nicht so funktioniert wie das aller anderen, die diese Frage stellen?

Aktualisieren

Nur um dieses Problem aus den Kommentaren herauszunehmen und es klarer in die Frage zu stellen. Nachdem ich die Änderung von @Ryan Bigg unten vorgenommen hatte, hatte ich ein Routing-Problem in meiner Umleitung zum Profil, als ein neues erstellt wurde. Hier ist mein Erstellungscode:

  def create
    @user = User.new(params[:user])
    if @user.save
        session[:user_id] = @user.id
        flash[:success] = "Thank you for signing up."
        redirect_to ('/'[email protected])
        #redirect_to @user, notice: "Thank you for signing up!"
    else
        render "new"
    end
  end

Und hier ist meine user.rb

def to_param
    self.username
    #username
end

Die auskommentierte Umleitung, die meines Erachtens mit dem to_param-Update funktionieren sollte, funktioniert jedoch nicht, während die hässliche hackige Umleitung darüber funktioniert. Warum wird das to_param überschrieben,was für andere Leute gearbeitet hat, arbeite ich nicht an meiner App? Meine Methoden #update und #edit funktionieren auch nicht, da ihre Weiterleitungen zu "users / 1 / edit" anstatt zu "username / edit" wechseln, wenn das Überschreiben von to_param dies nicht berücksichtigt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage