deviseを使用したユーザー情報の編集で、バスワード入力を省略する
手順 3つ
- deviseコントローラファイルの作成(routes.rbの編集)
- registrations_controller.rbの編集
- edit.html.erbの編集
1.deviseコントローラファイルの作成(routes.rbの編集)
deviseのコントローラを編集するため、以下を行ってください。
$ rails g devise:controllers users
①コマンド実行で作成されるファイル
Running via Spring preloader in process *****
create app/controllers/users/confirmations_controller.rb
create app/controllers/users/passwords_controller.rb
create app/controllers/users/registrations_controller.rb
create app/controllers/users/sessions_controller.rb
create app/controllers/users/unlocks_controller.rb
create app/controllers/users/omniauth_callbacks_controller.rb
===============================================================================
②追加でroutes.rbに以下のような記述が必要なことをお知らせしてくれている
Some setup you must do manually if you haven't yet:
Ensure you have overridden routes for generated controllers in your routes.rb.
For example:
⬇︎ 追記内容 ⬇︎
Rails.application.routes.draw do
devise_for :users, controllers: {
sessions: 'users/sessions'
}
end
===============================================================================
補足) このコマンドを実行しない限り中身をみることはできませんが、ユーザー登録時やサインイン時などは上記のコントローラで処理をしています。
上記の指示に習って、routes.rbを編集します。
# before
Rails.application.routes.draw do
devise_for :users
# after
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: "users/registrations",
}
# 今回は”編集”に関することなので、registrations_controllerのみ記述しています。
2. registrations_controller.rbの編集
パスワードなしで編集できるように登録(編集)時に処理を行うコントローラの記述を変更します。ファイル下部のprotected
のコメントアウトを外したうえで、その下にupdate_resourceメソッド
を追記してください。
# コメントアウト外す
protected
#必須 更新(編集の反映)時にパスワード入力を省く
def update_resource(resource, params)
resource.update_without_password(params)
end
#任意 更新後のパスを指定
def after_update_path_for(resource)
user_path(@user.id)
end
これで更新時にパスワードを入力しなくてもよくなりました。
ただ編集画面にパスワードの入力欄が残ったままなので、もう少し変更を加えます。
3. edit.html.erbの編集
最後に編集画面からパスワード入力欄をなくします。
まずはdeviseのビューを編集できるようにするため、以下を行ってください。
$ rails g devise:views
Running via Spring preloader in process *****
==== 必要な部分以外省略 ====
create app/views/devise/registrations/edit.html.erb
続いてビューからパスワード欄の記述を削除します。
# 以下の記述を削除
<div class="field">
<%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, autocomplete: "new-password" %>
<% if @minimum_password_length %>
<br />
<em><%= @minimum_password_length %> characters minimum</em>
<% end %>
</div>
<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>
<div class="field">
<%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "current-password" %>
</div>
以上で変更作業は終了です。
最後に動作確認を行いましょう。
動作確認
今回は変更後の様子を分かりやすくするため、更新後に遷移する詳細ページのビューを以下のようにしています。ユーザー情報にnickname
も追加しています。
事前に登録した内容
nickname: sample
email: sample@sample
pasword: ******
ユーザー詳細ページ
--- 登録編集画面は以下のようになっています。ユーザー登録編集ページ
パスワードの入力欄がすべてなくなっていますね。
それではユーザー情報を更新してみましょう。
nicknameをテストユーザー
に変更し、update
ボタンを押します。
すると、、、
変更内容
nickname: sample => テストユーザー
ユーザー詳細ページ(更新後)
名前が sample
から テストユーザー
に変わりましたね。
以上で終了となります。お疲れ様でした。
また最後までお読みいただきありがとうございました。
補足
補足1)3. edit.html.erbの編集で任意事項(更新後にユーザー詳細ページへ遷移する)を記述した方は、変数@user
を使用するため、usersコントローラのshowアクションで以下のように定義しておく必要があります。
def show
@user = User.find(params[:id])
end
補足2)ユーザー詳細ページのコードは以下の通りです。同じshowアクションを使い、リンクによってマイページと他ユーザーのページが切り替わるようにしてあります。
#マイページの記述
<% if params[:id].nil? || @user.id == current_user.id %>
<h1>ようこそ<%= current_user.nickname %>さん</h1>
ここはusers#showページです。
<p>名前:<%= current_user.nickname %></p>
<p>登録email:<%= current_user.email %></p>
<br>
アカウントを編集しますか?
<%= link_to "はい", edit_user_registration_path %>
<br>
ログアウトしますか?
<%= link_to "はい", destroy_user_session_path, method: :delete %>
#他ユーザーページ記述
<% else %>
<h2>ここは<%= @user.nickname %>さんのページです</h2>
<p>名前:<%= @user.nickname %></p>
<p>登録email:<%= @user.email %></p>
<% end %>