railsでは、deviseというgemを使えば、簡単にログイン機能を実装することができます。
Gemfileにgem ‘devise’を追記
gem 'devise'
追記したらbundle install
次にdeviseに必要な初期設定とファイルを生成するためにrails g devise:install
を実行します。
会員をuserとして、userモデルを作成します。
$ rails g devise user
deviseでは、rails g devise モデル名
を実行すると自動的にdevise用のroutingの設定が追加されます。
deviseを使うと、rails g devise user
をするだけで、devise用のマイグレーションファイルも作成されます。
マイグレーションファイルを確認するとテーブルができているはずです。
次はview側です。これもrails g devise:views
を実行するだけです。
$ rails g devise:views
deviseの基本的な設定はこれで終わりです。コントローラは作成しませんでしたが、これはdeviseのroutingが実行されると、gem内にあるコントローラに処理が渡されるためです。
試しに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用の設定が必要になります。
config/initializers/devise.rb
にある、config.secret_key
を有効にします。