Правильная маршрутизация для короткого URL по имени пользователя в Rails

Я пытаюсь заменить вид профиля пользователя такого рода

/users/1

с

/username

Я знаю, что это означает, что мне нужно будет проверять наличие столкновений различного типа. Я консультировался со следующими аналогичными вопросами SO:

Ruby on rails routing matching username customize rails url with username Routing in Rails making the Username an URL: routing error with :username in url

Вот несколько неудачных определений маршрутов route.rb, которые я пробовал, и связанных с ними ошибок:

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

Here's the error:

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User without an ID

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

Here is my corresponding users_controller:

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

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

Same error as above.

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'

Same error as 1.

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

Server does not start.

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

Error:

 ActiveRecord::RecordNotFound in UsersController#show

 Couldn't find User with id=:id

Любая идея, почему моя маршрутизация не работает так же, как и все остальные, кто задает этот вопрос?

Update

Просто чтобы убрать этот вопрос из комментариев и поставить его в вопросе более четко. После внесения изменений @Ryan Bigg ниже, у меня возникла проблема с маршрутизацией при перенаправлении в профиль при создании нового. Вот мой код создания:

  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

А вот и мой user.rb

def to_param
    self.username
    #username
end

Однако закомментированное перенаправление, которое, я думаю, должно работать с обновлением to_param, не работает, в то время как уродливый хакер, приведенный выше, работает. Почему перезаписывается to_param,который работал для других людейне работает на моем приложении? Мои методы #update и #edit также не работают, так как их перенаправления идут по адресу «пользователи / 1 / редактировать». вместо & quot; имя пользователя / редактировать & quot; если перезапись to_param не позаботится об этом.

Ответы на вопрос(2)

Ваш ответ на вопрос