LoginSignup
13
19

More than 3 years have passed since last update.

[Rails]deviseにカラムを追加する

Posted at

なんで書いた

deviseでユーザー認証を作るとemailとpasswordは最初からあるけど、ユーザー登録するのに名前は必要でしょ。といつも思ってるのでメモっとく。

前提

  • 既にdeviseのgem追加してること
  • rails g devise Userしてあること

カラムを追加する

DBにカラムを追加するときは、以下のような書き方をするのが一般的です。
とりあえず、そのマイグレーションファイルが何をするためのファイルがわかる名前にしましょう。

名前つけるとき、AddColumnToUsersって書いて「ユーザーテーブルにカラム追加する」みたいな意味だと、次カラム追加する時名前困るので注意。そもそもカラムを追加することになる=DB設計ちゃんとしろってことなのかと思ったりしてますが、この辺はまだまだ知識が浅いので強い方教えて欲しいです。

$ rails generate migration Addカラム名Toテーブル名 追加するカラム:データ型
$ rails generate migration AddNameToUsers name:string
XXXXXXXXXXX_add_name_to_users.rb
class AddNameToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :name, :string
  end
end
$ rails db:migrate

ControllerとViewの修正

registrations/new.html.erb
<h2>Sign up</h2>

<%= 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 %><br />
    <%= f.text_field :name, autofocus: true %>
  </div>
    # ここまで

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

  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "new-password" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
  </div>

  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>

Viewから飛んできたnameの情報を受け取れるようにしたいので、
application_controller.rb
に以下を追記します。

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])
  end
end

以下のコードをapplication.html.erbへ記述します。
current_userはdeviseが提供しているメソッドの一つで、ログインしているユーザーの情報を取得することができます。

application.html.erb
<% if current_user.present? %>
  <p>こんにちは、<%= current_user.name %>さん!</p>
<% else %>
  <p>こんにちは、ゲストさん!</p>
<% end %>

うまく表示されていればOK!

スクリーンショット 2020-07-22 17.47.14.png

13
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
19