ルーティングの編集


今回は、resourcesではなく、resourceを使っていきます。

本来、/users/:id/edit、のようになるはずですが、もしidを変えれば、他のユーザーのプロフィール編集ページに入ることができてしまう可能性があります。(もちろん、入れないようにバリデーションはかけますが)

プロフィール変更ページは自分自身に対してしか使わないので、idを用いず、pofile/editとなるようにルーティングを設定していきます。

Rails.application.routes.draw do
  root to: 'static_pages#top'

  get 'login', to: 'user_sessions#new'
  post 'login', to: 'user_sessions#create'
  delete 'logout', to: 'user_sessions#destroy'
 
  resources :users, only: %i[new create]
  resource :profile, only: %i[show edit update]
  resources :boards do
    resources :comments, only: %i[create destroy], shallow: true
    collection do
      get :bookmarks
    end
  end
  resources :bookmarks, only: %i[create destroy]
end

コントローラーの作成


$ bin/rails g controller profiles

今回の場合は、modelに紐付かないcontrollerの作成となります。

これまでの課題でもモデルに紐づかないコントローラは出てきました( static_pages_controller.rb など)が、改めてここで復習しましょう。

初学者によくある勘違いとして『コントローラに対して必ず同名のモデルが存在している』という考え方が挙げられます。確かにその用途が多いのは間違いないでしょう。今回の課題でも boards_controller.rb に対しては board.rb が、 comments_controller.rb に対しては comment.rb が対応しており、コントローラに対して同名のモデルが存在していると言えるでしょう。

しかし必ずしもそうである必要はありません。

プロフィールの編集画面への遷移を考えた時に、素直にRailsのCRUDに従うと以下のようになると思います。「 /users/:id/edit 」しかしプロフィールの編集というのは、自分自身のものに対してしか行いません。それにもかかわらずURLに id が含まれているのは少々分かりづらい気がします。また「この id を書き換えたら他人のプロフィールを編集できそう」と容易に想像されてしまうリスクもあります。(もちろん他人のプロフィールを編集できないような制御は必須です)

もしプロフィールの編集画面へのURLが /profile/edit になっていれば、上記の問題は解決するのではないでしょうか?