はじめに
現在私はポートフォリオを作成しています。今回の記事では、現在進行形で理解ができていない、フラッシュメッセージについて理解したことを備忘録として記録しておきたいと思います。
現状
Google認証を行った後に、ログイン・ログアウトは実行できるようになったのですが、フラッシュメッセージの設定で戸惑ってしまったため、今回はI18n(国際化)とbootstrapでのフラッシュメッセージを実行していきたいと思います。
流れ
まずはbootstrapの導入についてはこれらの記事を参考に実施しました。
I18n(国際化)について
フラッシュメッセージ自体は表示されるのですが、英語表記でわかりづらかったので、こちらを導入しました。
gem 'rails-i18n'
Gemの追加を行いbundle install
を実行してください。
~中略~
config.i18n.default_locale = :ja
上記の記述をファイルの下にend
が2つあると思うので、その上に記述をしてください。
これで基本的な準備は終わりです。あとは自分の現状に合わせたymlファイルを作成してください。
私の場合は、devise
のGoogle認証のフラッシュメッセージが必要だったので、config/locales/devise.en.yml
という自動で作成してくれている英語表記のファイルをChatGptに日本語表記で作り替えてもらい、同じフォルダ内にdevise.ja.yml
を作成しました。
フラッシュメッセージ
これは使用頻度が多いと思うため、パーシャルでファイルを用意します。views/shared/_flash_message.html.erb
に記述していきます。
<% flash.each do |key, message| %>
<div class="alert alert-<%= key %>"><%= message %></div>
<% end %>
上記のコードは、flashが起こったら、flashの中にハッシュの形でデータがあるため、それらをeach
を活用して取り出します。class='alert alert-<%= key %>"
はbootstrapの機能の一つで、key
に入ったものによってカラーを変えてくれます。これは公式を参考に実施してみてください。
omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
skip_before_action :verify_authenticity_token, only: :google_oauth2
def google_oauth2
@user = User.from_omniauth(request.env['omniauth.auth'])
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: "Google") if is_navigational_format?
else
session["devise.google_data"] = request.env["omniauth.auth"].except(:extra)
redirect_to new_user_registration_url
end
end
def failure
redirect_to root_path
end
end
Googleのログイン機能でユーザーのデータをもとに、ログインなど行うcontrollerです。今回はこの中のフラッシュメッセージに関わる部分がbootstrapで上手く反映させることができなかったため、ただフラッシュメッセージが出力されるだけの形でした。ですので、このコードを理解していこうと思います。
set_flash_message(:notice, :success, kind: "Google") if is_navigational_format?
これがflashにどのようにデータが渡るのか理解できていなかったため、まずはそれを勉強しました。
set_flash_message
というdeviseのメソッドを活用することで、devise.ja.yml
の以下のコードを自動的に検索してくれる。
omniauth_callbacks:
failure: "%{kind} での認証に失敗しました。理由:%{reason}。"
success: "%{kind} アカウントでログインしました。"
なので、今回はsuccess:
の方の記述が_flash_message.html.erb
のコードのmessage
として、
:notice
は_flash_message.html.erb
のコードのkey
としてflashのハッシュに保存されていることが理解できた。
その後、公式を見たところ、_flash_message.html.erb
にある、class="alert alert-<%= key %>"
では、keyの部分がsuccessになる必要があるとわかったため、以下のように修正をした。
- set_flash_message(:notice, :success, kind: "Google") if is_navigational_format?
+ set_flash_message(:success, :success, kind: "Google") if is_navigational_format?
これによりフラッシュメッセージが日本語で出るようになり、さらにbootstrapによりデザインされていました。
おわりに
今回のフラッシュメッセージで詰まってしまった時に、記事に書いてあることコードを打つばかりではなく、自分で解決策についえ考えながら、公式をよく見てみることの大切さがわかりました。生成AIが当たり前の時代ですが、プログラミング思考力を身につけつつ、ポートフォリオを作成していきたいと思います。