새로운 프로젝트를 생성하기 위해 먼저 config/routes.rb
파일에 get '/projects/new', to: 'projects#new', as: :new_project
라우트를 추가하고, ProjectsController
에 new
액션을 정의합니다. new
액션 내에서 @project = Project.new
를 통해 비어 있는 Project
인스턴스를 생성함으로써 폼 빌딩을 용이하게 합니다. 뷰 파일 new.html.erb
에서는 Rails의 강력한 form_with
헬퍼를 사용하여 폼을 생성합니다. 이 헬퍼는 폼 제출 경로, HTTP 메서드(POST), 그리고 필드 이름 포맷팅 및 CSRF 보호를 위한 숨겨진 필드까지 자동으로 처리하여 개발자가 직접 HTML 폼을 작성하는 수고를 덜어줍니다. 폼이 제출되면 post '/projects'
라우트에 매칭되어 create
액션이 호출됩니다. create
액션에서는 project_params
메서드를 통해 Strong Parameters를 적용하여 보안을 강화합니다. Strong Parameters는 허용된 파라미터만 데이터베이스에 저장되도록 하여 악의적인 데이터 주입을 방지하는 Rails의 중요한 보안 기능입니다. 프로젝트 저장이 성공하면 해당 프로젝트의 상세 페이지로 리다이렉션하고(redirect_to project_path(@project)
), 실패하면 render :new, status: :unprocessable_entity
를 통해 폼을 다시 렌더링하여 사용자에게 오류를 알립니다.
프로젝트 생성 시 이름 필드가 비어 있는 것을 방지하기 위해 Project
모델에 validates :name, presence: true
유효성 검사를 추가합니다. Rails 콘솔을 통해 project.errors.full_messages
로 유효성 검사 실패 이유를 확인할 수 있으며, 뷰에서는 @project.errors.any?
조건을 사용하여 오류 메시지를 사용자에게 친절하게 표시합니다. 또한, message: "Did you forget to add a name?"
과 같이 사용자 정의 오류 메시지를 설정하여 더 나은 사용자 경험을 제공할 수 있습니다.
기존 프로젝트를 수정하기 위해 get '/projects/:id/edit', to: 'projects#edit', as: :edit_project
라우트를 추가하고 edit
액션에서 Project.find(params[:id])
를 통해 특정 프로젝트를 조회합니다. 수정 폼을 위한 edit.html.erb
뷰는 새로운 프로젝트 생성 시 사용했던 폼과 동일한 form_with
헬퍼를 재사용합니다. Rails는 form_with
에 전달된 객체가 기존 객체임을 인지하여 자동으로 업데이트 폼으로 동작하도록 설정합니다. 폼 제출 시에는 patch '/projects/:id'
라우트에 매칭되어 update
액션이 호출되며, project.update(project_params)
를 통해 프로젝트 정보를 업데이트합니다.
프로젝트 삭제 기능은 delete '/projects/:id'
라우트와 destroy
액션을 통해 구현됩니다. destroy
액션에서는 project.destroy
를 호출하여 데이터베이스에서 해당 프로젝트를 삭제하고, flash[:notice] = 'Project deleted'
메시지와 함께 projects_path
로 리다이렉션합니다.
사용자에게 작업 성공 여부를 즉각적으로 알리기 위해 Flash 메시지를 활용합니다. flash[:notice]
에 메시지를 저장하면 다음 요청 시 해당 메시지가 application.html.erb
레이아웃 파일에 표시됩니다. 또한, new.html.erb
와 edit.html.erb
뷰에서 동일하게 사용되는 폼 코드를 DRY(Don’t Repeat Yourself) 원칙에 따라 _form.html.erb
라는 부분 뷰(Partial)로 분리하고, render 'form', project: @project
와 같이 렌더링하여 코드 중복을 제거하고 유지보수성을 높입니다. 마지막으로, Rails는 CRUD 기능에 필요한 모든 라우트를 한 줄로 자동 생성해주는 resources :projects
헬퍼를 제공하여, 개발자가 개별 라우트를 수동으로 정의하는 번거로움을 줄여줍니다. 이는 Rails의 강력한 컨벤션 기반 개발 방식의 대표적인 예시입니다.