【Rails】deviseで編集ページとマイページを分ける

最初は、編集ページ(registrations/edit.html.erb)の中にプロフィール情報(ユーザーネーム等)を入れてタブ切り替えで編集フォームを出そうと思っていたが、これでいいのか感があり、編集ページとマイページを分離しようとして若干詰まったのでメモ。

問題だったところ

最初に問題点から。

マイページ(users/show.html.erb)から、link_toでdeviseの編集ページ(devise/edit.html.erb)へ飛ぼうとした時のエラー。

原因はルーティングの順番だった。

修正前

config/routes.rb
resources :users, only: [:show]
devise_for :users, controllers: {
  sessions: "users/sessions",
  registrations: "users/registrations"
}

修正後

config/routes.rb
devise_for :users, controllers: {
  sessions: "users/sessions",
  registrations: "users/registrations"
}
resources :users, only: [:show]

users#showアクションのルーティングをdevise_forの後に書かないといけなかったらしく、前に書くとエラーが起こる。

手順

controllerを作成

まずdeviseを使わない時のように普通にusers_controllerを作る

Terminal
rails g controller users show

routeを設定

そしてルーティング

config/routes.rb
resources :users, only: [:show]

controllerを編集

ユーザー情報を取得

app/controllers/users_controller.rb
def show
  @user = User.find(params[:id])
end

viewを編集

表示する内容は適宜に

app/views/users/show.html.erb

マイページ

<%= link_to "プロフィール編集", edit_user_registration_path %> <%= @user.user_name %>

登録後、編集後のリダイレクト先を変更

app/controllers/users/registrations_controller.rb
def after_sign_up_path_for(resource)
  user_path(@user.id)
end

def after_update_path_for(resource)
  user_path(@user.id)
end

参考にしたサイト

Devise で作成した User モデル用のコントローラーの index, show アクションを追加
Devise で devise_for メソッドによるルーティングを確認 | EasyRamble で確認したとおり、Devise で User モデルを作成した場合、対応する Users コントローラーの index, show 用のルー...
タイトルとURLをコピーしました