1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

基本的なユーザー登録とログイン機能を実装するためのRuby on Railsチュートリアル

2022-01-03 14:18:08

Railsでユーザ登録とログインを実装するのはとても簡単で、たとえばDeviseのような完全に機能するgem拡張を使用します。また、Rails独自のhas_secure_passwordを使って自作することもできます。ここでは、has_secure_passwordを使ってユーザー登録とログインを実装する試みを紹介します。

動作の準備

プロジェクトを作成します。

int nrAttributes;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);
std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl;

has_secure_password の暗号化関数は bcrypt を必要としますので、プロジェクトで bcrypt gem パッケージを有効化する必要があります。プロジェクトのディレクトリに移動して、Gemfileファイルを以下のように修正します。

# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'


保存して終了し、bundle install コマンドを実行して、新しく有効になった gem パッケージをインストールします。

user モジュールの作成

ユーザー情報を操作・管理するためには、ユーザーを保持するデータテーブルとモデルを作成する必要があります。

rails g model user name:string password_digest:string


password_digest このフィールドは、暗号化および難読化されたパスワード文字列を格納するために使用され、必ず指定しなければならず、他の名前に変更することはできません。そうでなければ、has_secure_passwordによって提供される機能で適切に動作しません。

次に、user モジュールに has_secure_password 関数を導入します。

# app/models/user.rb
class User < ActiveRecord::Base
 has_secure_password
end


ユーザーデータ・テーブルを作成します。

rake db:migrate


登録機能の実装

ユーザー登録を処理する Applicant コントローラを作成します。

rails g controller applicants new create


応募者 コントローラは、2つのメソッドを提供します。

  • new: 登録画面を処理するために使用されます
  • create: 登録情報を保存するために使用します

上記のコマンドで作成されたコントローラのメソッドは、デフォルトですべて get リクエストを使用します。登録情報を保存する create メソッドは post リクエストを使用します。そのため、config/routes.rbで以下を変更する必要があります。

post 'applicants/create'


コントローラ関数の登録を終了します。

# app/controllers/applicants_controller.rb

class ApplicantsController < ApplicationController
 def new
  @user = User.new
 end

 def create
  @user = User.create(user_params)
  if @user.save
   redirect_to :sessions_new
  else
   render "new"
  end
 end

 private
  def user_params
   params.require(:user).permit(:name, :password, :password_confirmation)
  end
end



登録画面機能を完成させる。

<! -- app/views/applicants/new.html.erb -->

<h1>Register</h1>

<% if @user.errors.any? %>
<ul>
  <% @user.errors.full_messages.each do |message| %>
  <li><%= message %></li>
  <% end %>
</ul>
<% end %>

<%= form_for @user, url: :applicants_create do |f| %>
  <p>
    <%= f.label :name %>
    <%= f.text_field :name %>
  </p>

  <p>
    <%= f.label :password %>
    <%= f.password_field :password %>
  </p>

  <p>
    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation %>
  </p>

  <p><%= f.button "submit" %></p>
<% end %>



登録機能を簡単に実装したものです。

ログイン機能の実装

ユーザーのログインとログアウトを処理するSessionコントローラを作成します。

rails g controller sessions new create


ここでは、セッションコントローラで2つのメソッドがデフォルトで作成されています。

  • new: ログイン画面を処理するために使用されます
  • createは、ログイン処理を行うために使用されます

登録と同様に、createのデフォルトルートをpostに変更する必要があります。

# config/routes.rb

post 'sessions/create'



セッションコントローラ機能を完成させる。

# app/controllers/sessions_controller.rb

class SessionsController < ApplicationController
 def new
 end

 def create
  user = User.find_by(name: user_params[:name]).try(:authenticate, user_params[:password])
  if user
   render plain: sprintf("welcome, %s!", user.name)
  else
   flash.now[:login_error] = "invalid username or password"
   render "new"
  end
 end

 private
  def user_params
   params.require(:session).permit(:name, :password)
  end
end



セッションのログイン画面を完成させる。

<! -- app/views/sessions/new.html.erb -->

<h1>login</h1>

<% if flash[:login_error] %>
  <p><%= flash[:login_error] %></p>
<% end %>

<%= form_for :session, url: :sessions_create do |f| %>

  <p>
    <%= f.label :name %>
    <%= f.text_field :name %>
  </p>

  <p>
    <%= f.label :password %>
    <%= f.password_field :password %>
  </p>

  <p><%= f.button "login" %></p>

<% end %>