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 にインストールするのが慣習になっている。

  • 参考資料: Bundlerを使ったGemパッケージの管理 - Let'sプログラミング

13.2. ユーザ認証のプラグイン

Railsのプラグインは、gemの形で用意されている。例として、ユーザ認証を行うdeviseというプラグインを使ってみよう。

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.rbdevise_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.erbbody 要素の最初あたりに次の行を追加しておく。

<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 が提供しているメソッドで、認証が済んでいれば何もしない。済んでいなければログイン画面へリダイレクトされる。

13.3. 今日のまとめ

ここまでのソースコードはこちら