shou2017.com
JP / EN

Rails5.2でdeviseを使う

Sat Aug 4, 2018
Sat Aug 10, 2024

環境

$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
$ rails -v
Rails 5.2.0

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

deviseの初期設定

Gemfileにgem ‘devise’を追記

gem 'devise'

追記したらbundle install

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

$ rails g devise:install

rails g devise:installを実行すると以下が表示されますので、それに合わせて設定します。

$ rails g devise:install
Running via Spring preloader in process 9646
      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:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

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

上記作業がまだだったら。 1の通り、config/environments/development.rbに以下を追加。

 <!-- config/environments/development.rb -->

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

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