- 更新日: 2016年11月22日
- Devise
RailsのDevise 認証でのユーザー情報更新ページ(users/edit)で、独自に追加した name フィールドを更新する
Devise::RegistrationsController#edit → Devise::RegistrationsController#update のアクションにおける、ユーザー情報更新の際に、独自に追加したフィールドを編集して更新できるようにします。
Rails4 Devise でサインアップ用のユーザー登録フォームに、独自の入力フィールドを追加する | EasyRamble で、ユーザー登録フォームにnameフィールド(名前入力の項目)を追加しました。
今回は、この追加したnameフィールド(名前)を、/users/edit(edit_user_registration_path)のページから、編集して更新できるようにします。
— 環境 —
rails 5.0.0.1
devise 4.2.0
【追記 2016/11/22】
Devise 4 では Strong Parameters の API が変更されましたので、その点について追記を行いました。
【追記ここまで】
— 記事初回公開時の環境 —
Rails 4.0.1
Devise 3.2.2
ユーザー情報更新ページのビューを編集
まずは、以下のように name フィールドをビューに追加。事前に、Rails で Devise のビューを作成してカスタマイズ | EasyRamble を参考にして、カスタマイズ用のビューを作成しておきます。
app/views/users/registrations/edit.html.erb
1 2 |
<div><%= f.label :name %><br /> <%= f.text_field :name %></div> |
これで、さあできた楽勝楽勝と思って、テストやブラウザで試しましたところ、name フィールドの更新ができず少々はまりました。
strong parameters での :account_update で許可するパラメータを追加
strong parameters だなと見当をつけて、Devise のソースを眺めましたところ…以下のコードを発見。
app/controllers/devise/registrations_controller.rb
1 2 3 |
def account_update_params devise_parameter_sanitizer.sanitize(:account_update) end |
Devise::RegistrationsController の最後で、:account_update のアクションでのサニタイズを行っています。ということで、Rails の認証プラグイン Devise での Strong Parameters について | EasyRamble を参考に、以下のように strong parameter でのパラメータ許可を設定します。
Devise 4 の場合の Strong Parameters 設定
Devise 4 では、devise_parameter_sanitizer.permit メソッドを使います。
app/controllers/application_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_filter :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) devise_parameter_sanitizer.permit(:account_update, keys: [:name]) end end |
Devise 3 の場合の Strong Parameters 設定
Devise 3 の場合の書き方は以下。
app/controllers/application_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_filter :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :name devise_parameter_sanitizer.for(:account_update) << :name end end |
これでユーザー情報を更新できるようになり、テストも全て通過。ぐぐったら以下の stackoverflow のページも見つけました。
- Devise の関連記事
- RailsのDevise認証機能での実装チェックリストまとめ
- Deviseで送信されるメールのfrom(送信者メールアドレス)を変更
- Facebook の OAuth 認証で OAuthException(191)エラー
- Rails Devise でパスワードリセットなどのメールテンプレート(Mailer ビュー)をカスタマイズ
- Rails + Devise 環境でのフレンドリーフォワーディング機能を修正
- Deviseでユーザー登録完了時にウェルカムメールを送信する
- Rails Devise でユーザーがプロフィール情報を更新後に元のページにリダイレクトさせる
- Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
- Rails Deviseの日本語化辞書ファイル(devise.ja.yml)
- Rails + Devise で admin ユーザー(管理者)を削除できないようにする
- 初回公開日: 2013年12月27日
Leave Your Message!