今回は、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 になっていれば、上記の問題は解決するのではないでしょうか?