13. プラグイン¶
13.1. gemとbundler¶
Rubygemsという、インターネットから自動的にRubyのパッケージをダウンロードしてインストールしてくれるシステムがある。ここでは詳しい説明はしないが、コマンドラインで gem
コマンドを実行すると説明が出てくる。
# gem
すでにインストールされているパッケージの一覧を見たいときは次のようにする。
# gem list
ただし、
デフォルトのインストール先は管理者権限が必要。
開発環境と本番環境でインストールされているgemのバージョンが違うとトラブルの原因になる。
というようなことがあるので、bundlerを使うことが多い。これは、それぞれのアプリケーションに必要なgemを、アプリケーションごとに別々にインストールして管理するものである。
あるアプリケーションに必要なgemは、そのアプリケーションの中の
Gemfile
に書いておく。bundle install
を実行すると、依存関係も含めてインストールされる。--path
オプションを指定すると好きな場所にインストールできる。なお、--path
は一度指定すると覚えていて、これ以降は指定しなくても同じ場所を使うようになる。Dockerを使う場合は、コンテナ内に普通は一つしかRailsアプリケーションがないので、インストール場所について考える必要はない。
Railsアプリケーションを複数動かす場合は、各アプリケーションの中の
vendor/bundle
にインストールするのが慣習になっている。
13.2. ユーザ認証のプラグイン¶
Railsのプラグインは、gemの形で用意されている。例として、ユーザ認証を行うdeviseというプラグインを使ってみよう。
参考資料: devise/README.md
13.2.1. 準備¶
Gemfile
に次の行を追加する。
gem 'devise'
bundle
コマンドでインストールする。
# bundle install
Railsアプリケーションにdeviseを組み込む。
# rails generate devise:install
13.2.2. ユーザのデータベースを作る¶
Deviseは、デフォルトでは、メールアドレスとパスワードで認証を行うようになっているので、それを保存するデータベースを作らなければならない。ここではデータベースの名前を user
にする。
# rails generate devise user
これによって次の操作が行われる。
user
というモデルができる。user
用のマイグレーションファイルができる。config/routes.rb
にdevise_for :users
というルーティングが追加される。
次にマイグレーションをすると、実際にデータベースができる。
# rails db:migrate
コントローラとビューは、deviseに内蔵されているので、そのまま使う場合は何もしなくてよい。
これでログインの動作はできるはずである。 rails routes -c devise
で /users/なんとか
というルーティングができていることを確認する。サーバを起動し、 http://localhost:3000/users/sign_in をアクセスすると、ログイン画面が見えるはず。
13.2.3. Flash の設定¶
この後は、認証機能を自分のアプリケーションに組み込んでいく。
まず、認証でいろんなメッセージやエラーが出るので、それを表示するようにしなければならない。どのページでも表示できるように、 app/views/layouts/application.html.erb
の body
要素の最初あたりに次の行を追加しておく。
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
13.2.4. メール送信の設定¶
パスワードの再発行などでメールを送る場合があるので、メール送信の設定をしておかなければならない。 config/environments/development.rb
に次の行を追加。なお、本番環境に移行する時は、 config/environments/production.rb
に本番用の設定を書く。
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.sfc.keio.ac.jp',
port: 587,
domain: 'sfc.keio.ac.jp',
user_name: ENV['MAILER_USER'],
password: ENV['MAILER_PASSWORD'],
authentication: :login
}
ユーザ名とパスワードは直接ファイルに書くのは危険なので、環境変数から読み取るようにする。サーバを立ち上げる前に、次のように環境変数をセットする。
# export MAILER_USER='CNSログイン名' # export MAILER_PASSWORD='IMAP/SMTPパスワード'
注釈
キャンパス内のネットワークから宛先がSFCドメインのメールを出す場合は、25番ポートを使ってログイン名・パスワード無しで接続できる。Outbound Port 25 Blocking を実施していないISPを利用する場合も同様。
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:address => 'smtp.sfc.keio.ac.jp',
:port => 25,
:domain => 'sfc.keio.ac.jp'
}
13.2.5. トップページの用意¶
認証の後にトップページにリダイレクトされる場合があるので、トップページをちゃんと用意しておく。
config/routes.rb
にトップページのルーティングを追加する。例えば、コントローラの名前を welcome
にして index
メソッドを呼び出したい場合は次のような行を書く。
root 'welcome#index'
トップページ用のコントローラを作る。 index
メソッドだけあればよいので、次のようなコマンドを実行する。
% rails generate controller welcome index
index
メソッドの中身は何も書かなくてよい。
トップページ用のビュー(この例だと app/views/welcome/index.html.erb
)ができているので、適当に編集する。例えば次のような感じで。
<h1>Welcome#index</h1>
<% if user_signed_in? %>
<p>You are <%= current_user.email %></p>
<%= button_to 'Logout', destroy_user_session_path, method: :delete %>
<% else %>
<%= button_to 'Login', new_user_session_path %>
<% end %>
user_signed_in?
は、ログイン状態であればtrue
、そうでなければfalse
を返す。current_user
は現在ログインしているユーザのインスタンス。email
メソッドを呼び出すとメールアドレスが返ってくる。
注釈
Deviseではログアウトのリクエスト( destroy_user_session_path
)を HTTP Verb DELETE で送るようになっている。しかし、Rails7では link_to
でDELETEを使うのはいろいろと面倒(下記資料参照)なので、 button_to
を使う方がよい。
13.2.6. フィルタの設定¶
トップページにログイン画面を置いても、他のURLを直接指定されては意味が無いので、ログインしていない場合は他のページへのアクセスを禁止したい。普通はコントローラのフィルタとして認証チェックをするメソッドを指定しておく。
フィルタは、アクション(コントローラのメソッド)の実行前や実行後に自動的に実行されるメソッド。
app/controllers/application_controller.rb
(すべてのアクションに共通のコントローラ)に次の行を追加。
before_action :authenticate_user!
authenticate_user!
はdevise
が提供しているメソッドで、認証が済んでいれば何もしない。済んでいなければログイン画面へリダイレクトされる。