なんで書いた
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!