Help us understand the problem. What is going on with this article?

deviseを使ったUserモデルにカラムを追加してストロングパラメーターを実装する

はじめに

deviseを使うとユーザーのログイン・ログアウト機能などを簡単に実装できると聞いたので、早速使ってみました。
ただdeviseをインストールしてモデルを作成後に確認してみると name カラムがデフォルトでは存在しなかったので、 name カラムを追加してデータベースに保存できるようストロングパラメーターを設定してみることにしました。

基本的な手順はDevise - GitHubに書かれていることを参考にしました。

※Userモデルとビューを作成した後を想定しています。
deviseの導入は次が参考になりました。

手順

  1. コマンドを実行してマイグレーションファイルを作成
  2. マイグレーションに設定を加える
  3. ストロングパラメーターを設定
  4. フォームを修正

マイグレーションファイルを作成・設定

まずはじめにマイグレーションファイルを作成

$ rails g migration AddColumnToUsers name:string


追加されたマイグレーションファイルにNOT NULL制約やデフォルトの値に空文字などを追加します。

db/migrate/xxxxx_add_column_to_users.rb
class AddColumnToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string, null: false, default: ""
  end
end

追加後、保存したらマイグレートを実行

$ rails db:migrate

では nameカラム が追加されたのかを確認します。
コンソールを起動して、User.column_namesを実行することで確認することができます。

$ rails c
>> User.column_names

=>[
  "id",
  "email",
  "encrypted_password",
  "reset_password_token", 
  "reset_password_sent_at", 
  "remember_created_at",
  "created_at",
  "updated_at",
  "name" <= 追加されていれば成功
]

ストロングパラメーターを設定して保存できるように

ユーザー登録画面などで入力されたユーザー名をUsersテーブルに保存させるには、ApplicationControllerで設定する必要があります。

app/controllers/application_controller.rb
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])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
    # --- ここまでを追加 ---
end

追加した内容を解説していきます。

  • 一番上のbefore_action ...では、Applicationコントローラが読み込まれる前に 、下の configure_permitted_parameters というメソッドを、 deviseコントローラ を使うときにのみ実行させるための記述です。


  • configure_permitted_parametersメソッドでは、ユーザー登録・編集フォームで受け取ったユーザー名をデータベースへ保存できるようにストロングパラメーターを設定します。

フォーム画面を修正

あとはユーザー登録・編集フォームにユーザー名の入力を追加します。
見た目は整えてないですが、ユーザー名が入力できてデータベースに保存できれば完璧です!

  • app/views/devise/registrations/new.html.erb
new.html.rb
.
.
.
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
    <%= render "devise/shared/error_messages", resource: resource %>

    <div class="field">
      <%= f.label :name %>
      <%= f.text_field :name, class: "xxx" %> 
    </div>

    <div class="field">
      <%= f.label :email %><br />
      <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
    </div>
.
.
.

さいごに

name カラムの追加とストロングパラメーターの設定ができるようになって、色々してみたくなったので、次はユーザーのプロフィール画像を設定したり、いろんなテーブルと関連付けたりして遊んでみます。

色々やってみた結果を記事にしてみたいと思います。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away