基礎課題6 フラッシュメッセージ

2021.3.12

フラッシュメッセージ

❶と❷があるので確認必須

❶回答例に載っていた記述の少ない方法

 

1.フラッシュの定義を追加する

2.Controllerにフラッシュメッセージを記述する

3.フラッシュメッセージの表示をViewに追加する

4.フラッシュメッセージの翻訳定義を追加する

 

 

1.フラッシュの定義を追加する

Bootstrapに合わせて、フラッシュの定義をcontroller全体で使用できるようにする。

add_flash_typesメソッド:Bootstrapに対応したsuccess info warning dangerの4つのキーが使用できルようになる。

(app/controllers/application_controller.rb)

class ApplicationController < ActionController::Base
add_flash_types :success, :info, :warning, :danger
end

参照

https://api.rubyonrails.org/classes/ActionController/Flash/ClassMethods.html

https://qiita.com/Yama-to/items/4d19a714d8bf5bfbabdd

 

2.Controllerにフラッシュメッセージを記述する

1を行うことで、controllerのredirectをフラッシュメッセージを含めて1行で記載可能になる。

(app/controllers/user_sessions_contriller.rb)

def create
@user = login(params[:email], params[:password])
if @user
redirect_back_or_to root_path, success: t('.success')
else
flash.now[:danger] = t('.fail')
render :new
end
end

def destroy
logout
redirect_to root_path, success: t('.success')
end

 

3.フラッシュメッセージの表示をViewに追加する

(1)フラッシュメッセージを表示するパーシャルを作成

(app/views/shared/_flash_message.html.erb)

<% flash.each do |message_type, message| %>
<div class="alert alert-<%= message_type %>"><%= message %></div>
<% end %>

 (内容)

1行目3行目:該当するflashに対して2行目の操作を実行する

2行目: メッセージ<%= message %>を表示する。

    表示色はmessage_typeに従う。

            class="alert " と alert-<%= message_type %>は、bootstrapの機能である。             「alert-タイプ」というクラスを指定すると、そのタイプの表示色になる。

            (ex)(alert-successは緑 alert-dangerは赤 のようになる。)

 

(2)(app/views/layouts/application.html.erb)にパーシャルを追加する。

<body>
<% if logged_in? %>
<%= render 'shared/header' %>
<%else%>
<%= render 'shared/before_login_header' %>
<%end%>
<%= render 'shared/flash_message' %> #追加
<%= yield %>
<%= render 'shared/footer' %>
</body>

 

 4.フラッシュメッセージの翻訳定義を追加する

(config/locales/views/ja.yml)

ja:
 
users:
new:
title: 'ユーザー登録'
to_login_page: 'ログインページへ'
create:
success: 'ユーザー登録が完了しました'
fail: 'ユーザー登録に失敗しました'
user_sessions:
new:
title: 'ログイン'
to_register_page: '登録ページへ'
password_forget: 'パスワードをお忘れの方はこちら'
create:
success: 'ロフインしました'
fail: 'ログインに失敗しました'
destroy:
success: 'ログアウトしました'

 

❷自分で調べた方法

参照 

【Rails】フラッシュメッセージ、エラーメッセージのファイル作成、適用 | 【MaronBlog】ド素人が話題の趣味を始めてみた

 

(1)フラッシュメッセージのパーシャルファイル作成

(2)表示させたい場所のcontrollerにflashの記述をする

(3)application.html.erbでrender

 

 

(1)フラッシュメッセージのパーシャルファイル作成

・フラッシュメッセージのファイル名は

「_flash_messages.html.erb 」が通例になっている。

・コードを記述する

<% flash.each do |message_type, message| %>
<div class="alert alert-<%= message_type %>"><%= message %></div>
<% end %>

(内容)

1行目3行目:該当するflashに対して2行目の操作を実行する

2行目: メッセージ<%= message %>を表示する。

    表示色はmessage_typeに従う。

            class="alert " と alert-<%= message_type %>は、bootstrapの機能である。             「alert-タイプ」というクラスを指定すると、そのタイプの表示色になる。

            (ex)(alert-successは緑 alert-dangerは赤 のようになる。)

 

(2)表示させたい場所のcontrollerにflashの記述をする。メッセージを定義する。

def create
@user = User.new(user_params)
if @user.save
flash[:success] = 'ユーザー登録が完了しました'
redirect_to login_path
else
flash.now[:danger] = 'ユーザー作成に失敗しました'
render :new
end
end

[:success][:danger]これがフラッシュメッセージの「message_type」になる。

 

flash[ ]  => 次のリクエスト終了時まで表示される。
flash.now[ ] => 次のリクエスト開始時まで表示される。

render => ビューを描画するだけで、新たにhttpリクエストは送信しない。

redirect_to => 新たにhttpリクエストを送信して、その結果コントローラからビューが描画される。

 

<組み合わせについて>

flashとredirect_to => 次のページにリダイレクトした時点でflashはきえる。

flashとrender => renderはリクエストを送信しないので、次のページに移行してもflashは残る

flash.nowとredirect_to =>redirect_toの時点で flashが消えるため、flash自体表示されない

flash.nowとrender => 次のページへリダイレクトした時点ででflashは消える

参照

redirect_toとrender, flashとflash.nowの違い - Qiita

 

(3)application.html.erbでrender

application.html.erbはファイル全体に適用させるファイルなので、ここでrenderしておけば全てのviewページでフラッシュメッセージを適用可能になる。

・<body>と</body>で囲まれた部分の間に↓を入力する。

<%= render 'shared/flash_message' %>