Rialsチュートリアルに従って、アプリを作っていくと、User Modelの作成、User ControllerでCRUDができます。
このUser Modelを使用して、自分のサービスを作ってみようと思っている人も多いのではないでしょうか。ぼくもその口でした。
目標は簡易的なユーザーごとのホームページサービスを作ること。
しかし、チュートリアル通りのルーティングでユーザーページを表示しようと思うと、
/users/(:id)
となるためちょっとダサい。
そこでルーティングを
/(:username)
と、できるように改造しました。その方法と不具合をまとめました。
##1. どうやったのか
参考にしたのは、下記のリンク
http://blog.takady.net/blog/2015/11/29/rails-routing-with-username-instead-of-id/
この3番目を参考にして、routes.rbは
Rails.application.routes.draw do
resources :users, param: :username, path: '/', only: [:show, :edit, :update, :destroy]
end
となりました。
User tableのカラムは name -> usernameに変更しました。
##2. User Controllerの修正
チュートリアルではparams[:id]をURLから受け取っていました。
def edit
@user = User.find(params[:id])
end
しかし、1. でみた通り、param: :username とparamsの定義を変更しているので、:usernameで検索する必要があります。
def edit
@user = User.find_by(username: params[:username])
end
他のメソッド(update, deleate)でも同様に、params[:username]に変更する必要があります。Privateで定義しているメソッドも忘れないように更新しましょう。
def correct_user
@user = User.find_by(username: params[:username])
redirect_to(root_url) unless current_user?(@user)
end
##3. Viewで貼っているリンクの変更
ユーザーのページへのリンクはcurrent_userメソッドで受け取ったidとしていましたが、usernameに変更したので、
<%= link_to "Profile", current_user, class: "nav-link" %>
を
<%= link_to "Profile", user_path(current_user.username), class: "nav-link" %>
に変更する必要があります。
4. Picture Uploaderの不具合?
なぜか不具合が起きましたが、Rails serverを再起動したら直りました。結構はまってしまって、次の日起きたらできるようになっていたので、コンチクショーとなりました。
##5. まとめ
デフォルトから変更するのは思いもよらない不具合が多かったですが、その分勉強になりました。