Popraw routing dla krótkiego adresu URL przez nazwę użytkownika w Railsach

Próbuję zastąpić widoki profilu użytkownika tego rodzaju

/users/1

z

/username

Wiem, że to oznacza, że ​​będę musiał sprawdzać różnego rodzaju kolizje. Sprawdziłem następujące podobne pytania dotyczące SO:

Ruby na routingu na railsach pasujący do nazwy użytkownikadostosuj adres URL rails przy użyciu nazwy użytkownikaRouting w Railsach sprawia, że ​​nazwa użytkownika jest adresem URL:błąd routingu z: nazwa użytkownika w adresie URL

Oto różne nieudane trasy. Definicje tras, które wypróbowałem i związane z nimi błędy:

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

Oto błąd:

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User without an ID

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

Oto mój odpowiedni kontroler user_controller:

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

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

Ten sam błąd co powyżej.

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'

Ten sam błąd co 1.

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

Serwer nie uruchamia się.

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

Błąd:

 ActiveRecord::RecordNotFound in UsersController#show

 Couldn't find User with id=:id

Każdy pomysł, dlaczego mój routing nie działa tak samo, jak wszyscy, którzy zadają to pytanie?

Aktualizacja

Wystarczy wziąć ten problem z komentarzy i bardziej czysto umieścić go w pytaniu. Po dokonaniu zmiany przez @Ryan Bigg poniżej miałem problem z routingiem w moim przekierowaniu do profilu, gdy tworzony jest nowy. Oto mój kod do tworzenia:

  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

A oto mój user.rb

def to_param
    self.username
    #username
end

Jednak skomentowane przekierowanie, które moim zdaniem powinno działać z aktualizacją to_param, nie działa, podczas gdy brzydki hackish powyżej niego działa. Dlaczego nadpisywanie to_param,który pracował dla innych ludzi, nie działa na mojej aplikacji? Moje metody #update i #edit również nie działają, ponieważ ich przekierowania przechodzą do „users / 1 / edit” zamiast „username / edit”, jeśli nadpisanie to_param nie zajmie się tym.

questionAnswers(2)

yourAnswerToTheQuestion