Hanami 애플리케이션에서 새로운 책을 추가하고 기존 책을 수정하는 과정을 단계별로 설명합니다. Rails 개발자에게 익숙한 개념과 Hanami의 차이점을 명확히 제시하며, 코드 예시를 통해 실제 구현 방법을 안내합니다.
1. 새 책 폼 구현
-
hanami g action books.new및hanami g action books.create명령어를 통해 액션을 생성합니다. -
config/routes.rb파일에/books/new경로를books.new액션에,/books경로를books.create액션에 연결하는 라우트를 정의합니다. -
app/templates/books/index.html.erb에 새 책 폼으로 이동하는 링크를 추가하고,app/templates/books/new.html.erb에form_for헬퍼를 사용하여 책 제목, 저자, 출판 연도를 입력받는 폼을 작성합니다.form_for헬퍼는 Rails와 유사하지만 위치 인자를 사용하며,params[:book]형태로 데이터를 전송합니다. -
app/actions/books/create.rb에서BookRepo를 의존성으로 주입받아request.params[:book]데이터를 사용하여 새 책을 생성하고, 성공 시 플래시 메시지를 설정한 후 생성된 책의 상세 페이지로 리다이렉트합니다. -
플래시 메시지 사용을 위해
config/app.rb에 세션 지원(config.sessions = :cookie, { secret: "..." })을 추가하고,app/templates/layouts/app.html.erb에 플래시 메시지를 표시하는 코드를 삽입합니다. -
app/repos/book_repo.rb에commands :create를 추가하여BookRepo가 책 생성 명령을 처리할 수 있도록 합니다.
2. 유효성 검사 추가
-
app/actions/books/create.rb의params블록에dry-schema젬을 활용하여 유효성 검사를 정의합니다.required(:title).filled(:string)과 같이title및author필드는 필수 문자열로,year필드는 선택적 정수로 지정합니다. 이는 Rails의validates_presence_of와strong_parameters기능을 동시에 제공합니다. -
handle메서드 내에서request.params.valid?를 통해 유효성 검사를 수행하고, 유효하지 않을 경우response.flash.now[:error]메시지를 설정하고new_view를 렌더링하며errors를 전달합니다. -
app/actions/books/create.rb에include Deps[new_view: "views.books.new"]를 추가하여new_view를 의존성으로 주입받습니다. -
app/views/books/new.rb에expose :errors를 추가하여 뷰에서 에러 객체에 접근할 수 있도록 하고,app/templates/books/new.html.erb에 에러 메시지를 표시하는 코드를 추가합니다.
3. 책 수정 폼 구현
-
hanami g action books.edit및hanami g action books.update명령어를 통해 액션을 생성합니다. -
config/routes.rb파일에get "/books/:id/edit"경로를books.edit액션에,patch "/books/:id"경로를books.update액션에 연결하는 라우트를 정의합니다. -
app/templates/books/show.html.erb에edit_book경로를 사용하는 편집 링크를 추가합니다. -
app/templates/books/_form.html.erb파셜을 생성하여new및edit뷰에서 폼 코드를 재사용합니다. 이 파셜은form_type변수를 통해create또는update상황에 따라 폼의 경로, HTTP 메서드, 제출 버튼 텍스트를 동적으로 변경합니다. -
app/actions/books/edit.rb에서id파라미터를 뷰로 전달하고,app/views/books/edit.rb에서book_repo.find(id)를 통해 책 데이터를 로드하여expose :book으로 폼 필드를 자동으로 채웁니다. -
app/actions/books/update.rb에서id및book파라미터에 대한 유효성 검사를 정의하고,handle메서드에서 유효성 검사 후book_repo.update를 호출하거나edit_view를 렌더링하며 에러를 전달합니다. -
app/actions/books/update.rb에include Deps[edit_view: "views.books.edit"]를 추가하여edit_view를 의존성으로 주입받습니다. -
app/repos/book_repo.rb에commands :create, update: :by_pk를 추가하여BookRepo가id를 기준으로 책 업데이트 명령을 처리할 수 있도록 합니다. -
app/views/books/edit.rb에expose :errors를 추가하여 업데이트 실패 시 에러를 표시할 수 있도록 합니다.