Ruta correcta para url corto por nombre de usuario en Rails
Estoy tratando de reemplazar las vistas de perfil de usuario del tipo
/users/1
con
/username
Soy consciente de que esto significa que tendré que comprobar si hay colisiones de varios tipos. He consultado las siguientes preguntas de SO similares:
Ruby on rails enrutando el nombre de usuario coincidentepersonalizar rieles url con nombre de usuarioEnrutamiento en Rails haciendo del nombre de usuario una URL:error de enrutamiento con: nombre de usuario en urlAquí están las diversas definiciones de ruta de route.rb fallidas que he probado y los errores asociados:
match "/:username" => "users#show", via: "get"
Aquí está el error:
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User without an ID
app/controllers/users_controller.rb:7:in `show'
Aquí está mi correspondiente control_usuario:
6 def show
7 @user = User.find(params[:id])
8 end
match "/:username" => 'users#show', :as => :profile
Mismo error que el anterior.
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'
El mismo error que 1.
match '/:username', to: 'users/:id', via: 'show'
El servidor no se inicia.
match "/:username" => redirect("/users/:id")
Error:
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with id=:id
¿Alguna idea de por qué mi ruta no funciona de la misma manera en que lo hacen todos los demás que hacen esta pregunta?
Actualizar
Solo para sacar este tema de los comentarios y ponerlo en la pregunta de manera más limpia. Después de realizar el cambio por @Ryan Bigg a continuación, tuve un problema de enrutamiento en mi redireccionamiento al perfil cuando se crea uno nuevo. Aquí está mi código de creación:
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
Y aquí está mi user.rb
def to_param
self.username
#username
end
Sin embargo, el redireccionamiento comentado, que creo que debería funcionar con la actualización de to_param, no funciona, mientras que el feo truco anterior lo hace. ¿Por qué es la sobrescritura to_param,que funcionó para otras personas, no funciona en mi aplicación? Mis métodos #update y #edit tampoco funcionan, ya que sus redireccionamientos van a "users / 1 / edit" en lugar de "username / edit" si sobrescribir to_param no se ocupa de esto.