Railsのユーザ作成について
Railsでログイン機能を実装する場合に、ユーザ作成を行うと思います。
今回は、その、ユーザ作成機能について説明していきます。
使用するコントローラ
toppagesコントローラ(サインアップページへ移行するurlがある)
-index
usersコントローラ
-index,show,new,create
の二つです。toppages,usersのように、語尾に「s」を付けているのは、あとあと便利になってくるからです。
使用するモデル
Userモデル
-name:string email:string password_digest:string
ユーザ名、メールアドレス、パスワードを入力とします。
Gemファイルに
gem 'bcrypt', '~> '
のような記述がありますが、railsに提供されている認証機能です。
この行のコメントアウトを消し、
$ bundle install
を実行し、railsのサーバを再起動させましょう。
また、railsで「bcrypt」を使用する際は、モデル作成時に、
password_digest:string
の記述が必須となります。この記述が無ければ認証ができなくなるので注意しましょう。
コントローラ
topppagesコントローラは、ページの表示だけなので、usersコントローラのみを記述します。
class UsersController < ApplicationController
def index
@users = User.all.page(params[:page])
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
flash[:success] = 'ユーザを登録しました。'
redirect_to @user
else
flash.now[:danger] = 'ユーザの登録に失敗しました'
render :new
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
特筆すべきなのはcreateアクションのuser_paramsのところです。
ストロングパラメータの、password_confirmationは、確認用のパスワードのことです。
password_confirmationが記述されることで、パスワードの確認をプログラムがいい感じにやってのけてくれます。
モデル
ユーザモデルに、has_secure_passwordと記述することでbcryptの認証機能を呼び出すことが出来ます。
class User < ApplicationRecord
has_secure_password
end
ユーザ作成画面
CSSも適用してない最低限の画面です。
<h1>Sign up</h1>
<p>
<%= form_for(@user) do |f| %>
<p>
<div class="form-group">
<%= f.label :name, 'Name' %>
<%= f.text_field :name, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :email, 'Email' %>
<%= f.email_field :email, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password, 'Password' %>
<%= f.password_field :password, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password_confirmation, 'Confirmation' %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
</div>
<P>
<%= f.submit 'Sign up', class: 'btn btn-primary btn-block' %>
<% end %>
<h3 class="panel-title"><%= @user.name %></h3>
これでユーザ作成に必要な主要な部分は完成しました!