【Ruby on Rails】ユーザー登録&ログイン機能を実装

Ruby on Railsでユーザー登録とログイン機能を作りました!

前回の【Ruby on Rails】簡単な掲示板を作成しましたで作成した掲示板を会員制の掲示板にしていきます。

まず、bcryptというパスワードを暗号化してくれるライブラリをインストールします。

railsのrootフォルダにあるGemfileというファイルを編集します。

何行目かに「gem ‘bcrypt’, ‘~」と言った感じの記述がコメントアウトされてるので、行頭の#を消します

gem 'bcrypt', '~> 3.1.7'

そして以下のコマンドを実行します

bundle install

これでbcryptがインストールされます。

次に会員情報を保存するモデルを作成します

$ rails g model User name:string password_digest:string
$ rails db:migrate

「name」はログインIDとして使います。

パスワードをpassword_digestという名前にしているのは、次に記述する「has_secure_password」というメソッドを実行するためです。この名前じゃないとだめみたいです。

$ rails g migration AddColumnUserIdToLog user_id:integer
$ rails db:migrate

次に「has_secure_password」とバリデーションを追加するため、app/models/user.rbを編集します。

class User < ApplicationRecord
	has_secure_password
    has_many :log
	validates :name, presence: true, uniqueness: true, length: {maximum: 20}
end

has_secure_passwordと書くことで何が出来るのかというのは、こちらの記事に詳しく載っています。

Railsのhas_secure_passwordとは - Qiita
Railsの「has_secure_passwordメソッド」について解説する。 使い方としては、以下のようにモデルに定義する。 user.rb class User < ApplicationRecord . ....

バリデーションはnameに空白禁止presence: true)、重複禁止uniqueness: true)、文字数は20字までlength: {maximum: 20})というルールを付与しています。

routes.rbを編集します

Rails.application.routes.draw do
  get "/bbs", to: "log#index"
  post "/bbs", to: "log#create"
  get "/signup", to: "users#new"
  post "/signup", to: "users#create"
end

app/controllers/users_controller.rb

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

app/views/users/new.html.erb

<h1>会員登録</h1>
<%= form_with model: @user, url: signup_path, local: true do |f| %>
    <div class="form-group">
        <label>ユーザーiD</label>
        <%= f.text_field :name, class: "form-control" %>
    </div>
    <div class="form-group">
        <label>パスワード</label>
        <%= f.password_field :password, class: "form-control" %>
    </div>
    <div class="form-group">
        <label>パスワード確認用</label>
        <%= f.password_field :password_confirmation, class: "form-control" %>
    </div>
    <%= f.submit "登録", class: "btn btn-primary"%>
<% end %>

app/controllers/users_controller.rbにcreateメソッドを作ります。

    def create
        user_params = params.require(:user).permit(:name, :password, :password_confirmation)
        @user = User.new(user_params)
        if @user.save
            flash[:notice] = "登録しました"
            session[:user_id] = @user.id
            redirect_to bbs_path
        else
            flash.now[:alert] = "登録に失敗しました"
            render "new"
        end
    end

コメント

タイトルとURLをコピーしました