Ruby on Rails

railsでユーザー登録機能を作成

gemで提供されているライブラリのdeviseを使用して、ログイン機能などを作成する

deviseのインストール

devise | RubyGems.org | your community gem host
公式サイトからバージョンも指定したものを持ってくると、バージョン依存が起きにくくなります。

gemfileに記述
gem ‘devise’, ‘~> 4.2’

※ >= x.x.x(x.x.x以上のバージョンが必要)
※ ~> x.0(x.1からx.9は良いが、メインのバージョンがあがるとは不可。例えば、3.2は良いが、4.0は不可など)
`gem ‘devise’`だけだと常に最新のバージョンがインストールされる。

bundle installを実行

次にdeviseを利用するための初期作業を行います。
rails g devise:install

Running via Spring preloader in process 14650
create config/initializers/devise.rb
create config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven’t yet:

1. Ensure you have defined default url options in your environments files. Here
is an example of default_url_options appropriate for a development environment
in config/environments/development.rb:

config.action_mailer.default_url_options = { host: ‘localhost’, port: 3000 }

In production, :host should be set to the actual host of your application.

2. Ensure you have defined root_url to *something* in your config/routes.rb.
For example:

root to: “home#index”

3. Ensure you have flash messages in app/views/layouts/application.html.erb.
For example:

<%= notice %>

<%= alert %>

4. You can copy Devise views (for customization) to your app by running:

rails g devise:views

===============================================================================

この画面が出て来たら成功です。

次にユーザー情報を保存するモデルを作成します。
普通にモデルを作成する際に利用するrails g model model名とは異なり、devise独自のルールになるので注意が必要です。
rails g devise User

Running via Spring preloader in process 14679
invoke active_record
create db/migrate/20181108040718_devise_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
insert app/models/user.rb
route devise_for :users

    ここまでで、

  • ユーザー情報を操作するUserという名前のモデル
  • ユーザー情報を保存するためのuserテーブルを作成するマイグレーションファイル
    が作成されました。

rake db:migrate

    未実行のマイグレーションファイルを実行

  • rake db:migrateを実行
  • schema_migrationsテーブルを調べ、存在しなければ作成
  • db/migrateディレクトリ内のすべてのマイグレーションファイルを調べる
  • データベースの現在のバージョンと異なるバージョンがあった場合、データベースに適応
  • schema_migrationsテーブルの更新

== 20181108040718 DeviseCreateUsers: migrating ================================
— create_table(:users)
-> 0.0065s
— add_index(:users, :email, {:unique=>true})
-> 0.0014s
— add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0014s
== 20181108040718 DeviseCreateUsers: migrated (0.0096s) =======================

マイグレーションファイルとは?

マイグレーションファイルは、テーブルの設計図です。
このファイルに記載されている内容でテーブルの列、名前(テーブル名、カラム名)が決まります。

テーブル名はモデル名の複数形となります。このように、Railsでは命名規則が厳密に決められています。

モデルの命名規則

Railsでは、ファイルやテーブルなどの命名を規則に従った形にする必要があります。モデルとテーブルに関する命名規則は以下のようになっており、これに従えばテーブルとモデルが結びつきます。

モデル名 先頭大文字、単数形
モデルのファイル名 先頭小文字、単数形
テーブル名 先頭小文字、複数形

deviseの設定の確認

routes.rbに自動でルーティングが追加されます。
deviseを使用する際にURLとしてusersを含みます

Rails.application.routes.draw do
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

models/user.rbには作成したUserモデルにdeviseで使用する機能が記述されている。

class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end

ここまでで、rake routesを実行するとユーザー登録(sign_in)やログイン画面(sign_up)が作成されていることが確認できます。

ログイン画面のviewを作成

deviseと関連づけられたビューを作成します。
rails g devise:views

Running via Spring preloader in process 14832
invoke Devise::Generators::SharedViewsGenerator
create app/views/devise/shared
create app/views/devise/shared/_links.html.erb
invoke form_for
create app/views/devise/confirmations
create app/views/devise/confirmations/new.html.erb
create app/views/devise/passwords
create app/views/devise/passwords/edit.html.erb
create app/views/devise/passwords/new.html.erb
create app/views/devise/registrations
create app/views/devise/registrations/edit.html.erb
create app/views/devise/registrations/new.html.erb
create app/views/devise/sessions
create app/views/devise/sessions/new.html.erb
create app/views/devise/unlocks
create app/views/devise/unlocks/new.html.erb
invoke erb
create app/views/devise/mailer
create app/views/devise/mailer/confirmation_instructions.html.erb
create app/views/devise/mailer/email_changed.html.erb
create app/views/devise/mailer/password_change.html.erb
create app/views/devise/mailer/reset_password_instructions.html.erb
create app/views/devise/mailer/unlock_instructions.html.erb

ログイン機能と関連付けされたビューや確認画面などのビューが作成されました。

views/devise/registrations/new.html.erbにはデフォルトで下記のフォームが作成されていますので、デザインの変更をしたい場合には下記を変更していきます。

Sign up

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>

<%= f.label :email %>
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
<%= f.label :password %>
<% if @minimum_password_length %>
(<%= @minimum_password_length %> characters minimum)
<% end %>
<%= f.password_field :password, autocomplete: "new-password" %>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
<%= f.submit "Sign up" %>

<% end %>

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