플래시 메시지란?
플래시(Flash) 메시지는 Rails 애플리케이션 사용자에게 자신의 행동에 대한 결과를 알려주는 소통 수단입니다.
예시 메시지:
- "비밀번호가 성공적으로 변경되었습니다" (확인)
- "사용자를 찾을 수 없습니다" (오류)
이러한 플래시 메시지는 컨트롤러에서 설정하고, 뷰(view)에서 렌더링하여 사용자가 상황에 맞게 대응할 수 있도록 합니다.
지금부터 그 동작 원리를 자세히 살펴보겠습니다!
플래시 메시지 사용 방법
알림 메시지는 flash 헬퍼 메서드를 사용해 다룰 수 있습니다.
flash는 Ruby 해시(hash)와 매우 유사하게 동작합니다.
keys, any?, each 같은 메서드를 제공하며, 특정 메시지에는 []로 접근할 수 있습니다.
그렇다면 어떤 종류의 플래시 메시지를 설정할 수 있을까요?
기본적으로 제공되는 타입:
- notice
- alert
사용 예시:
flash.alert = "User not found."
또는 이렇게 쓸 수도 있습니다:
flash[:alert] = "User not found."
(두 표기법의 차이는 단순히 스타일의 차이일 뿐입니다.)
이 코드는 index, create, new 등 컨트롤러 액션 안에서 자유롭게 사용할 수 있습니다.
또 다른 방법:
redirect_to :books_path, notice: "Book not found"
이렇게 하면 리다이렉트와 플래시 메시지 생성을 한 번에 처리할 수 있습니다.
아주 편리하죠!
alert과 notice의 차이
사실 alert을 쓰든 notice를 쓰든 기능상 큰 차이는 없습니다.
상황에 더 자연스럽게 느껴지는 것을 선택하면 됩니다.
저는 개인적으로 alert은 오류 메시지로, notice는 확인 메시지로 구분해서 사용하는 편입니다.
이렇게 구분해 두면 각각 다른 스타일을 적용하기에도 좋습니다.
예를 들어:
alert은 빨간색으로, notice는 초록색으로 표시할 수 있습니다.
또한 컨트롤러의 add_flash_types 메서드를 사용하면 자신만의 플래시 타입을 만들 수도 있습니다.
예시:
class ApplicationController add_flash_types :info, :error, :warning end
저는 단순함을 유지하는 것을 선호하기 때문에 기본 제공 타입만 사용하는 편입니다 🙂
플래시 메시지 렌더링하기
플래시 메시지는 자동으로 화면에 나타나지 않습니다.
사용자가 볼 수 있도록 반드시 뷰 안에서 렌더링해야 합니다.
애플리케이션 레이아웃(application layout)에 아래 코드를 추가하는 것을 추천합니다.
코드 예시:
<% flash.each do |type, msg| %>
<%= msg %>
<% end %>
이 코드는 알림을 표시하고 싶은 위치, 보통은 페이지 상단의 메뉴 바 아래에 배치하면 됩니다.
기억하세요:
메시지를 한 번 렌더링하면 flash에서 제거되므로, 같은 메시지가 다시 표시되지 않습니다.
알림 및 경고 메시지 스타일링
플래시 메시지에는 기본으로 제공되는 디자인이나 스타일이 없습니다.
해결책은?
Bootstrap을 사용 중이라면 "alert alert-info" CSS 클래스를 활용해 플래시 메시지를 깔끔하게 꾸밀 수 있습니다.
예시:
<% flash.each do |type, msg| %>
<%= msg %>
<% end %>
실제 화면 모습:

Bootstrap을 사용하지 않는다면 직접 CSS를 작성해 원하는 대로 디자인하면 됩니다.
플래시 메시지는 언제 렌더링될까?
플래시 메시지는 화면에 표시된 이후, 다음 컨트롤러 액션이 실행될 때 비로소 제거됩니다.
이로 인한 결과:
redirect_to후 플래시 메시지를 렌더링하면 정상적으로 동작합니다redirect_to후 메시지를 렌더링하지 않으면, 해당 메시지는flash해시에 그대로 남아 있게 됩니다- 플래시 메시지를 설정한 같은 액션에서
render를 호출하면 메시지는 표시되지만 제거되지 않으므로, 남아 있다가 두 번 표시될 가능성이 있습니다
그렇다면...
현재 액션에서 즉시 플래시 메시지를 표시하고 싶다면 어떻게 해야 할까요?
바로 이럴 때 flash.now를 사용합니다!
예시:
def index
@books = Book.all
flash.now[:notice] = "We have exactly #{@books.size} books available."
end
이 코드는 index 뷰를 렌더링합니다.
notice 메시지가 표시된 후 flash에서 제거되므로, 같은 메시지가 두 번 표시되지 않습니다.
정리하면:
리다이렉트하지 않고 render를 사용하는 경우에만 flash.now를 사용하면 됩니다.
마무리
Rails의 플래시 메시지와 올바른 사용법에 대해 배웠습니다!
참고로, 플래시 메시지는 유효성 검사(validation) 오류와는 다릅니다. 유효성 검사는 모델 객체와 연관되어 있으며, @user.errors처럼 errors 메서드를 통해 접근합니다.
이제 직접 코드를 작성하며 실습해 볼 차례입니다.
읽어주셔서 감사합니다!