Ruby on Railsチュートリアル第6版が終わり、そこで作ったサンプルアプリケーションの修正や機能追加をやってます。
追加第5章では、ログイン/認証システムとしてDeviseを導入します。
追加第5章 Deviseの導入

Railsチュートリアルによると、ログイン/認証システムにはDeviseが使われることが多いようなので、練習も兼ねてサンプルアプリケーションにDeviseを導入していきます。
参考にしたのは、「【Rails】deviseの使い方をマスターしてログイン認証機能を実装しよう!」という記事です。

Deviseのインストールと設定
Deviseはgemで提供されてるので、Gemfileに追加してbundle installを実行します。
その後、
rails g devise:install
これを実行するようです。
そうすると、
$ rails g devise:install
Running via Spring preloader in process 3761
create config/initializers/devise.rb
create config/locales/devise.en.yml
===============================================================================
Depending on your application's configuration some manual setup may be required:
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.
* Required for all applications. *
2. Ensure you have defined root_url to *something* in your config/routes.rb.
For example:
root to: "home#index"
* Not required for API-only Applications *
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>
* Not required for API-only Applications *
4. You can copy Devise views (for customization) to your app by running:
rails g devise:views
* Not required *
===============================================================================
こんな感じのメッセージが出てきました。参考にしてる記事と比べると、アスタリスク(*)のところが追加されてるようです。
デフォルトURLの設定
1番目はconfig.action_mailer.default_url_optionsの設定について書いてあります。
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
これは例として挙げられてるので、この通りにするのではなく、自分の開発環境に合わせて設定します。
ここのところはRailsチュートリアルで設定してあるので、このままでいいはずです。
root_urlの設定
2番目はroot_urlの設定です。これもRailsチュートリアルでやってあります。
フラッシュメッセージの設定
3番目はフラッシュメッセージの設定です。これもRailsチュートリアルでやりましたね。ただ、変数がnoticeとalertになってるので、これがどう影響するかわかりません。
とりあえず、何も変更しないで先に進むことにします。
ビューの作成
ここがいまいちわかりません。
rails g devise:views
このコマンドでDevise用のビューが作られるようなんですが、「Not required」、つまり「必要ない」と表示されてます。
よくわからないので、とりあえずこのコマンドは使わずに先に進むことにしました。
DeviseのUserモデル
Deviseを使うには、Devise用のUserモデルを作る必要があるようです。Railsチュートリアルで作ったサンプルアプリケーションにはすでにUserモデルがありますが、Devise用にも作ったらどうなるのは心配なところですね。
「【Rails】deviseの使い方をマスターしてログイン認証機能を実装しよう!」に書いてある通り、
rails g devise user
これを実行します。そうすると、何やらいろいろできたようです。
このあとどうすればいいかがいまいちわからず、「[*Rails*] deviseの使い方(rails6版)」を参考にしてマイグレーションをしたところ、エラーが出ました。
いろいろ調べても解決できませんでしたが、おそらくUserモデルがすでにあることが影響してると予想できます。別名のモデルにしてDevise導入するという方法もあるようですが、今回はやめました。
その理由は、Devise体験が目的だったからです。なので、無理にRailsチュートリアルのサンプルアプリケーションを使う必要はないということです。
そういうわけで、新しくアプリケーションを作って、Devise体験をすることにしました。
新アプリでDevise体験
今回はDevise体験を目的としたアプリケーションを作るだけなので、「[*Rails*] deviseの使い方(rails6版)」の通りにやることにしました。ただ、Twitterログインを入れないという変更だけしました。
Railsチュートリアルでアプリケーションの初期設定的なのをやったなと思いつつ、とりあえず書いてある通りに進めます。デフォルトURLに関しては、AWSに合わせて記述を変えました。ビューなどはコピペです。
今度はマイグレーションもうまくいき、Railsサーバーを立ち上げてページを表示したところでエラー。Railsチュートリアル第1章でやったCloud9への接続許可をやってなかったのが原因です。
あと違いが出たのは、
brew install yarn
これがうまくいかず、
sudo apt install linuxbrew-wrapper
このコマンドを入力するように求められたことくらいです。
これで準備が整ったと思ったら、またしてもエラー。どうやら、usernameというメソッドがないことが問題なようです。Twitterログイン関係でusernameカラムを入れてたみたいで、そのせいでした。
とりあえず、usernameはやめてemailで代用することにしました。
これでDevise導入ができましたが、Railsチュートリアルでのログイン機構実装に比べると圧倒的に簡単で驚きました。機能もいろいろあるようで、Deviseを使えばかなりの時間短縮になりますね。
まとめ
Railsチュートリアル追加第6章では、Deviseを導入してみました。本当はサンプルアプリケーションに導入したかったんですが、Devise体験が目的だったので途中で新しいアプリケーションを使うことにしました。
Deviseを使うとログイン/認証システムを簡単に導入できることがわかりました。
「こんなに簡単ならRailsチュートリアルでもDeviseを使えばいいのに」と思う人もいるかもしれませんが、Railsチュートリアルは学習用なので自力というかゼロからログイン/認証システムを作ってくことに意味があると思います。
僕も完璧にわかってるわけではないですが、ログイン/認証システムの基礎をぼんやりとでもわかってることが今後役に立つんじゃないかなと思ってます。
Railsチュートリアルのサンプルアプリケーションに機能を追加してくのも飽きてきたので、次からはオリジナルアプリケーションを作ることにしました。
今のところ候補は2つあります。両方とも本業(心理職)に関係するものです。
何をどう作るかを検討してから始動します。
