************ プラグイン ************ ============== 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プログラミング `_ ======================== ユーザ認証のプラグイン ======================== Railsのプラグインは、gemの形で用意されている。例として、ユーザ認証を行うdeviseというプラグインを使ってみよう。 * 参考資料: `devise/README.md `_ 準備 ---- ``Gemfile`` に次の行を追加する。 .. code-block:: ruby gem 'devise' ``bundle`` コマンドでインストールする。 :: # bundle install Railsアプリケーションにdeviseを組み込む。 :: # rails generate devise:install ユーザのデータベースを作る -------------------------- 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 をアクセスすると、ログイン画面が見えるはず。 Flash の設定 ------------ この後は、認証機能を自分のアプリケーションに組み込んでいく。 まず、認証でいろんなメッセージやエラーが出るので、それを表示するようにしなければならない。どのページでも表示できるように、 ``app/views/layouts/application.html.erb`` の ``body`` 要素の最初あたりに次の行を追加しておく。 .. code-block:: erb

<%= notice %>

<%= alert %>

.. _mailer: メール送信の設定 ---------------- パスワードの再発行などでメールを送る場合があるので、メール送信の設定をしておかなければならない。 ``config/environments/development.rb`` に次の行を追加。なお、本番環境に移行する時は、 ``config/environments/production.rb`` に本番用の設定を書く。 .. code-block:: ruby 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パスワード' .. note:: キャンパス内のネットワークから宛先がSFCドメインのメールを出す場合は、25番ポートを使ってログイン名・パスワード無しで接続できる。Outbound Port 25 Blocking を実施していないISPを利用する場合も同様。 .. code-block:: ruby 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' } .. _top-page: トップページの用意 ------------------ 認証の後にトップページにリダイレクトされる場合があるので、トップページをちゃんと用意しておく。 ``config/routes.rb`` にトップページのルーティングを追加する。例えば、コントローラの名前を ``welcome`` にして ``index`` メソッドを呼び出したい場合は次のような行を書く。 .. code-block:: ruby root 'welcome#index' トップページ用のコントローラを作る。 ``index`` メソッドだけあればよいので、次のようなコマンドを実行する。 :: % rails generate controller welcome index ``index`` メソッドの中身は何も書かなくてよい。 トップページ用のビュー(この例だと ``app/views/welcome/index.html.erb`` )ができているので、適当に編集する。例えば次のような感じで。 .. code-block:: erb

Welcome#index

<% if user_signed_in? %>

You are <%= current_user.email %>

<%= 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`` メソッドを呼び出すとメールアドレスが返ってくる。 .. note:: Deviseではログアウトのリクエスト( ``destroy_user_session_path`` )を HTTP Verb DELETE で送るようになっている。しかし、Rails7では ``link_to`` でDELETEを使うのはいろいろと面倒(下記資料参照)なので、 ``button_to`` を使う方がよい。 * `Rails 7.0 + Ruby 3.1でゼロからアプリを作ってみたときにハマったところあれこれ #Ruby - Qiita `_ フィルタの設定 -------------- トップページにログイン画面を置いても、他のURLを直接指定されては意味が無いので、ログインしていない場合は他のページへのアクセスを禁止したい。普通はコントローラのフィルタとして認証チェックをするメソッドを指定しておく。 * フィルタは、アクション(コントローラのメソッド)の実行前や実行後に自動的に実行されるメソッド。 * 参考資料: `Action Controller の概要 # 8. フィルタ - RailsGuides `_ ``app/controllers/application_controller.rb`` (すべてのアクションに共通のコントローラ)に次の行を追加。 .. code-block:: ruby before_action :authenticate_user! * ``authenticate_user!`` は ``devise`` が提供しているメソッドで、認証が済んでいれば何もしない。済んでいなければログイン画面へリダイレクトされる。 ============== 今日のまとめ ============== `ここまでのソースコードはこちら `_