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