$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
$ rails -v
Rails 5.2.0
railsでは、deviseというgemを使えば、簡単にログイン機能を実装することができます。
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モデルを作成します。
$ 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
を有効にします。