Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Rails 플래시 메시지 완벽 가이드: 기본 사용법부터 flash.now까지

플래시 메시지란?

플래시(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 %>

실제 화면 모습:

Rails 플래시 메시지 완벽 가이드: 기본 사용법부터 flash.now까지

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 메서드를 통해 접근합니다.

이제 직접 코드를 작성하며 실습해 볼 차례입니다.

읽어주셔서 감사합니다!