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 URLHier 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.