shou2017.com
JP / EN

Rails、ログイン機能を実装する

Sat Feb 24, 2018
Sat Aug 10, 2024

railsでは、deviseというgemを使えば、簡単にログイン機能を実装することができます。

deviseの初期設定

Gemfileにgem ‘devise’を追記

gem 'devise'

追記したらbundle install

次にdeviseに必要な初期設定とファイルを生成するためにrails g devise:installを実行します。

Userモデルの作成

会員をuserとして、userモデルを作成します。

$ rails g devise user

deviseでは、rails g devise モデル名を実行すると自動的にdevise用のroutingの設定が追加されます。

usersテーブルを作成する

deviseを使うと、rails g devise userをするだけで、devise用のマイグレーションファイルも作成されます。

マイグレーションファイルを確認するとテーブルができているはずです。

viewを作成する

次はview側です。これもrails g devise:viewsを実行するだけです。

$ rails g devise:views

deviseの基本的な設定はこれで終わりです。コントローラは作成しませんでしたが、これはdeviseのroutingが実行されると、gem内にあるコントローラに処理が渡されるためです。

deviseにカラムを追加する

試しにdeviseにnameというカラムを追加してみましょう。

$ rails g migration AddNameToUsers name:string
$ rake db:migrate

deviseのストロングパラメータにnameを追加。

deviseには、configure_permitted_parameters という専用のストロングパラメータを設定するメソッドがあるので、そこに追記します。

<!-- app/controllers/application_controller.rb -->

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  # before_actionで下で定義したメソッドを実行
  before_action :configure_permitted_parameters, if: :devise_controller?

  #変数PERMISSIBLE_ATTRIBUTESに配列[:name]を代入
  PERMISSIBLE_ATTRIBUTES = %i(name)

  protected

    #deviseのストロングパラメーターにカラム追加するメソッドを定義
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: PERMISSIBLE_ATTRIBUTES)
      devise_parameter_sanitizer.permit(:account_update, keys: PERMISSIBLE_ATTRIBUTES)
    end

configure_permitted_parametersは、before_actionにif: :devise_controller?を追記して、deviseのControllerの場合のみ起動させます。

※protectedとprivateについて private内に記述されているメソッドはクラス外から呼び出すことができませんが、protected内のメソッドは呼び出すことができます。 protected内にメソッドを記述することで、思わぬところからメソッドが呼び出されることを防ぎます。

新規登録画面にnameの入力フィールドを追加する。

<!-- app/views/devise/registrations/new.html.erb -->

<div class="field">
  <%= f.email_field :email, autofocus: true, class: "form-control", placeholder: "メールアドレス" %>
</div>

<!-- 名前入力用のフィールドを追加 -->
<div class="field">
  <%= f.text_field :name, class: "form-control", placeholder: "名前" %>
</div>

<div class="field">
  <%= f.password_field :password, autocomplete: "off", class: "form-control", placeholder: "パスワード" %>
</div>

編集画面にnameの編集フィールドを追加

<!-- app/views/devise/registrations/edit.html.erb -->

<div class="field">
  <%= f.label :メールアドレス %><br />
  <%= f.email_field :email, autofocus: true, class: "form-control" %>
</div>

<!-- 名前入力用のフィールドを追加 -->
<div class="field">
  <%= f.label :名前 %><br />
  <%= f.text_field :name, class: "form-control" %>
</div>

<% if  devise_mapping.confirmable? && resource.pending_reconfirmation? %>
  <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end  %>

herokuを使っている場合

herokuを使っている場合は、heroku用の設定が必要になります。

config/initializers/devise.rb にある、config.secret_keyを有効にします。

See Also