自分にやさしく学ぶプログラミング

プログラミング学習記録、備忘録

Ruby on Rails : deviseでユーザー認証追加してi18nしてユーザープロフィールページも追加するための手順の解説

概要

先日上げたエントリ(Ruby on Rails : deviseでユーザー認証追加してi18nしてユーザープロフィールページも追加するための手順(手順だけ))の解説。自明な部分は置いといて、自分がよくわからないと感じた部分だけまとめる。

参考資料

手順全体の意味をざっくりまとめる

  • 手順1〜5 deviseを入れてRailsアプリ立ち上げ
  • 手順6〜9 deviseのための設定
  • 手順10~11 deviseによるuserモデル追加(この段階でユーザー認証機能が備わる)
  • 手順12~13 カスタマイズ用のファイル生成
  • 手順14~18 ユーザー情報に項目を追加し、ログインユーザー以外のアクセスを禁止
  • 手順19~20 言語切り替えリンクの追加
  • 手順21~26 ユーザープロフィールページを追加

自分がよくわからなかったところ

手順6~9:deviseのための設定

deviseで指定されている設定。何も考えずにとりあえず書いとけば動く。

各設定の意味についてちょっと詳しく 手順6:
action_mailerの設定。action_mailerとはRailsアプリでメールを送受信するための仕組み。controllerと似ている。controllerがページを表示するviewと繋がっているのに対して、mailerはメールのviewと繋がっている。
そして上記設定はmailerにhost名とポート番号を設定するためのもの。mailerはWebサーバーのコンテキストと無関係であるため、明示的に設定する必要がある。

手順7:
root(今回なら http://localhost:3000/ )のルーティング。

手順8,9:
ログイン成功のメッセージを表示するためのもの。

手順12~13:カスタマイズ用のファイル生成

deviseはcontrollerもviewも用意してくれているので、特に必要なければそのまま使えばいいが、もし編集したい場合はrails gで生成したファイルを編集する。
手順12のコマンドでviewを生成すると、viewファイルはapp/views/devise/下に生成される。deviseというディレクトリ名をusersなどに変えてしまうと、scoped_viewと見なされるようで、viewを編集するために設定変更が必要となったり、i18nのlazy lookupが使えなくなったりするので注意。

手順16:ログインユーザー以外のアクセス禁止とStrong Parametersへの変数追加

1行目は文字通りのことをしてくれる。 その下は、Usersテーブルに追加したnameとprofileに値を渡せるようにするためのもの。RailsのStrong Parametersという仕組み(受け取れる値を制限する)により、この設定をしないと値をデーターベースに書き込めない。書き方としてはdevise_parameter_sanitizer.permit(許可するタイミング, 許可する項目)みたいな感じ。

手順19~20:言語切り替えリンクの追加

唐突だけど、これはユーザーがアプリ上で英語と日本語を切り替えられるようにするためのリンクを追加するもの。いらなければ飛ばしていい。

手順21~23:ユーザープロフィールページの追加

プロフィールページなど、自分でページを追加したいときは、改めてcontrollerとルーティングを記述する必要がある。Users::RegistrationsControllerとかに追記してもうまくいかない。

手順25~26:ユーザー情報を編集したらプロフィールページへ飛ぶようにする

デフォルトだと編集後はアプリのrootに飛ぶ。それだと編集結果が確認できないので、プロフィールページに飛ぶようにする。そのためには、Users::RegistrationsController内でafter_update_path_for(resource)をオーバーライドする。 controllerを変更したら、変更後のcontrollerを編参照するようにルーティングも修正する必要がある。deviseのルーティングはdevise_forメソッドを使って編集する。中括弧の中に適宜書き足していけば、任意のcontrollerについてルーティングを変更できる。

ルーティングを変更した場合のviewファイルについて
Copy the views from devise/sessions to users/sessions. Since the controller was changed, it won't use the default views located in devise/sessions.
deviseのREADMEより
とあるけど、私の環境では、viewファイルについてはdeviseフォルダにおいたままでも変更が反映されていた。

最後に

deviseはとりあえず認証機能をつかするだけならすぐだけど、少し変えようとするだけでも色々やることがあって難しかった。特にルーティングはrailsresourcesしたときとはちょっと雰囲気が違うので、よく確認したほうがいいなと思った。