터보 프레임 모달 활용법

Turbo Frame Modals. The Definitive Guide | by Andy Cohen | Medium

작성자
jeff
발행일
2025년 05월 26일

핵심 요약

  • 1 터보 프레임 모달 구현을 위해 링크는 'modal' 터보 프레임을, 컨트롤러 액션은 'modal' 레이아웃을 지정해야 합니다.
  • 2 폼 제출 성공 시 `turbo:frame-missing` 이벤트를 활용하여 터보 프레임에서 벗어나 성공 페이지로 리다이렉트합니다.
  • 3 폼 제출 실패 시에는 에러를 'modal' 레이아웃 내에서 다시 렌더링하여 모달 창을 유지할 수 있습니다.

도입

이 문서는 Turbo Frame을 활용하여 모달 다이얼로그를 구현하는 실용적인 방법을 설명합니다. Turbo Frame은 Rails 애플리케이션에서 페이지 전체 새로고침 없이 특정 부분만 업데이트할 수 있게 해주어, 사용자 경험을 개선하고 서버 부하를 줄이는 데 기여합니다. 특히 모달 구현 시 JavaScript 없이 서버 사이드 렌더링만으로 동적인 UI를 구성할 수 있는 강력한 대안을 제시합니다.

터보 프레임 모달 구현을 위한 두 가지 핵심 요구사항

터보 프레임 모달을 효과적으로 구현하기 위해서는 다음 두 가지 주요 조건을 충족해야 합니다. * 링크 타겟팅: 모달로 렌더링하려는 액션으로 연결되는 링크는 data: { turbo_frame: 'modal' } 속성을 사용하여 ‘modal’이라는 특정 터보 프레임을 대상으로 지정해야 합니다. 이는 해당 링크 클릭 시 응답이 전체 페이지 대신 지정된 ‘modal’ 프레임 내에서 처리되도록 합니다. ruby <%= link_to 'New Task', new_task_path, class: 'btn', data: { turbo_frame: 'modal' } %> * 컨트롤러 액션 레이아웃 지정: 모달로 의도된 컨트롤러 액션(예: new, create 실패 시)은 render layout: 'modal'을 통해 ‘modal’ 레이아웃을 명시적으로 지정해야 합니다. 이 레이아웃은 모달 콘텐츠를 감싸는 최소한의 구조를 제공하며, 일반적으로 비어있는 turbo-frame 요소를 포함하여 모달이 렌더링될 위치를 정의합니다. ```ruby class TasksController < ApplicationController def new @task = Task.new render layout: ‘modal’ end

  def create
    @task = Task.new(task_params)
    if @task.save
      redirect_to tasks_path, notice: 'Task was successfully created.'
    else
      render :new, status: :unprocessable_content, layout: 'modal'
    end
  end
end
```

터보 프레임에서 벗어나기 (폼 제출 처리)

폼 제출 성공 시 모달 프레임에서 벗어나 일반 페이지로 리다이렉션하고, 실패 시에는 에러와 함께 모달 내에서 다시 렌더링하는 방법은 다음과 같습니다. * turbo:frame-missing 이벤트 활용: 폼 제출 성공 시 Turbo는 기본적으로 레이아웃을 비워버리기 때문에, 애플리케이션 레이아웃에 있는 빈 ‘modal’ 터보 프레임이 “missing” 상태가 됩니다. 이 때 turbo:frame-missing 이벤트를 감지하여 프론트엔드에서 처리합니다. javascript document.addEventListener('turbo:frame-missing', (event) => { if (event.target.id === 'modal') { event.preventDefault() event.detail.visit(event.detail.response.url, { action: 'replace' }) } }) 이 이벤트 핸들러는 성공적인 리다이렉트 응답을 Turbo Drive의 visit 함수를 통해 처리하여, 전체 페이지를 새로고침하거나 지정된 action: 'replace'를 통해 “새로고침”처럼 작동하게 하여 모핑 및 스크롤 유지를 가능하게 합니다. * 실패 시 모달 유지: 폼 제출 실패 시에는 컨트롤러에서 render :new, status: :unprocessable_content, layout: 'modal'과 같이 ‘modal’ 레이아웃을 다시 지정하여 에러 메시지와 함께 폼을 모달 내에서 재렌더링합니다.

결론

Turbo Frame을 활용한 모달 구현은 JavaScript 의존도를 최소화하면서도 Rails 애플리케이션에서 동적이고 사용자 친화적인 모달 경험을 제공하는 효율적인 방법입니다. 링크 타겟팅, 컨트롤러 레이아웃 지정, 그리고 `turbo:frame-missing` 이벤트 처리를 통해 성공적인 리다이렉션과 실패 시 모달 내 에러 렌더링을 유연하게 관리할 수 있습니다. 이는 개발 생산성을 높이고 애플리케이션의 반응성을 향상시키는 데 크게 기여합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!