パスにuser_idを含まない仕様にする
参考にしたサイト https://blog.takady.net/blog/2015/11/29/rails-routing-with-username-instead-of-id/
現在のパスにuser_idが含まれているままだとアプリのユーザー数がわかってしまったり、もしデータベースからユーザー情報が消えてしまった場合、同じユーザーIDでアプリに入った時に新規登録したユーザーのアカウントでログインできてしまう可能性ああります。なのでパスにユーザーIDは含めたくないなあと思っていました。
なので本リリースする前にユーザーが全然いない時にやっておいた方がいいかな〜と思ったので今回実装していきます。
デバックや検証ツールなどを使用して進めていけたのでとても良い練習になりました。
まず最初にユーザーモデルにto_param
というactive recordのメソッドを使ってURLの:idの部分に id以外を指定できるようにします。今回はnameカラムを使用したいので下記のように記載しました。
user.rb def to_param name end
そして次にルーティングを作成していきました。param: :name
とすることで:name
をURLに含めることができるようになります。
resources :users, param: :name, only: [:new, :create, :index, :destroy] do resources :followers, only: [:index] get 'following', to: 'users#following' get 'follower', to: 'users#follower' resources :diaries do member do resources :bookmarks, only: [:index] end end end
たくさんネストしているので重点的に上記のパスが正常に動くか確認しながら進めていきたいと思います。
まず最初にサイトにアクセスしてみてエラーが出た箇所のコントローラを修正していきます。
日記一覧ページにアクセスするとidがnilというエラーが出ました。なのでdiaries_controller.rbのindexアクションを見てみます。
def index @user = User.find(params[:user_id]) @diaries = @user.diaries end
パラメータで送られてきたデータのuser_idを使用しているのでここをuser_nameにすればいけそうと思ったので修正します。
def index @user = User.find_by(name: params[:user_name]) @diaries = @user.diaries end
これでエラーは解消しました。
次は細かいですがdiaries_controller.rb
の色々なリダイレクト先でcurrent_user
や@user
でパスに送っている部分をcurrent_user.name
や@user.name
と記入して指定します。
ビューファイルも同様にパスに追記しておきます。
次はuser_controller.rb
です。ここはdestroy
アクションでuser_nameを指定しておかないと削除したいユーザーがわからずにエラーになります。最初params[:user_name]
としていたのですがエラーが出てしまったのでコンソールで確認しながら修正しました。
def destroy @user = User.find_by(name: params[:name]) @user.destroy redirect_to root_path, success: 'thank you' end
最後にフォローするボタンです。フォローを外すボタンは作動していたのですがフォローをするボタンで422エラーが出ていました。
@other_user = User.find_by(name: params[:follower])
このように変更することで、解決しました。検証ツールのコンソールを見ることの大切さを感じました。
一応全てのページを確認してエラーが出るページ、思ってもいないページへの遷移はしていないようでした。