- 更新日: 2016年11月8日
- Devise
Rails Deviseでサインアップ用のユーザー登録フォームに、独自の入力フィールドを追加する
Rails の認証プラグインである Devise では、デフォルトでのサインアップ用のユーザー登録フォームは、Eメール、パスワード、パスワード確認が入力項目となっています。これに、nameフィールド(名前入力の項目)を追加したい。割と簡単に追加できます。
— 環境 —
Rails 5.0.0.1
Devise 4.2.0
【追記 2016/11/08】
Devise 4 における Strong Parameters の Parameter Sanitizer API が変更されていたので、Devise 4 環境での Strong Parameters によるパラメータ許可の書き方について追記しました。
Rails の認証プラグイン Devise での Strong Parameters について | EasyRamble
https://github.com/plataformatec/devise
【追記ここまで】
— 記事初回公開時の環境 —
Rails 4.0.1
Devise 3.2.2
マイグレーションでDBテーブルにフィールドを追加
新たに、name フィールドをDBテーブルに追加するマイグレーションを作成。
1 2 3 |
$ bundle exec rails generate migration AddNameToUsers name |
db/migrate/***_add_name_to_users.rb
1 2 3 4 5 |
class AddNameToUsers < ActiveRecord::Migration def change add_column :users, :name,:string, null: false, default: "" end end |
私の場合、Rails4 で Devise と OmniAuth で、Twitter/Facebook のOAuth認証と通常フォームでの認証を併用して実装 | EasyRamble で name フィールドをすでに追加していたので、name フィールドに :string, null: false, default: “” のオプションを追加するマイグレーションを行いました。name フィールドは、入力必須で重複OKなフィールドにします。(ユニークキーは付けない。)
いったんDBをリセットして、usersテーブルのレコードを削除。name を null: false, default: “” に変更するので、レコードが残っているとマイグレートでエラーが起きます。(development 環境です。)
1 2 3 |
$ bundle exec rake db:reset |
マイグレーション作成。
1 2 3 |
$ bundle exec rails generate migration ChangeNameOptionsToUsers name |
db/migrate/***_change_name_options_to_users.rb
1 2 3 4 5 6 7 8 9 |
class ChangeNameOptionsToUsers < ActiveRecord::Migration def up change_column :users, :name, :string, null: false, default: "" end def down change_column :users, :name, :string, null: true, default: nil end end |
rake db:rollback で戻せるように、up と down を各々明示的に定義します。
name をユニーク(一意)にしたい場合は、インデックスとユニークキーもマイグレーションに追加します。
1 |
add_index :users, :name, unique: true |
マイグレート。
1 2 3 |
$ bundle exec rake db:migrate |
データベース確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
mysql> desc users; +------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | email | varchar(255) | NO | UNI | | | | encrypted_password | varchar(255) | NO | | | | | reset_password_token | varchar(255) | YES | UNI | NULL | | | reset_password_sent_at | datetime | YES | | NULL | | | remember_created_at | datetime | YES | | NULL | | | sign_in_count | int(11) | NO | | 0 | | | current_sign_in_at | datetime | YES | | NULL | | | last_sign_in_at | datetime | YES | | NULL | | | current_sign_in_ip | varchar(255) | YES | | NULL | | | last_sign_in_ip | varchar(255) | YES | | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | uid | varchar(255) | NO | MUL | | | | provider | varchar(255) | NO | | | | | name | varchar(255) | NO | | | | +------------------------+--------------+------+-----+---------+----------------+ 16 rows in set (0.01 sec) |
name の Null が NO に、Default が “” に変更されました。
ユーザー登録フォームのビューに name 用の入力フィールドを追加
app/views/users/regsitrations/new.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<h2>Sign up</h2> <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> <div><%= f.label :email %><br /> <%= f.email_field :email, :autofocus => true %></div> <div><%= f.label :name %><br /> <%= f.text_field :name %></div> <div><%= f.label :password %><br /> <%= f.password_field :password %></div> <div><%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation %></div> <div><%= f.submit "Sign up" %></div> <% end %> <%= render "users/shared/links" %> |
name フィールドを許可する strong parameters の設定(Devise 4)
Devise 4 では、パラメータを許可するための API が変更されています。Devise 4 において、:sign_up で :name を許可する例です。
app/controllers/application_controller.rb
1 2 3 4 5 6 7 8 9 |
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) end end |
name フィールドを許可する strong parameters の設定(Devise 3)
:sign_up で :name を許可します。
app/controllers/application_controller.rb
1 2 3 4 5 6 7 8 9 |
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :name end end |
User モデルでの validation
name フィールドは、入力必須で50文字以内にします。DBでユニークキー制約は付けずに、name の重複は許可しています。
app/models/user.rb
1 2 3 4 5 6 7 |
class User < ActiveRecord::Base # ・・・ validates :name, presence: true, length: { maximum: 50 } # ・・・ end |
以上で、サインアップ用のユーザー登録フォームに name という入力フィールドを追加できました。必要に応じて、edit ビューなども編集。
- 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月15日
Leave Your Message!