学習記録

アウトプット用に作りました

パスに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])

このように変更することで、解決しました。検証ツールのコンソールを見ることの大切さを感じました。

一応全てのページを確認してエラーが出るページ、思ってもいないページへの遷移はしていないようでした。