새로운 프로젝트를 생성하기 위해 먼저 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의 강력한 컨벤션 기반 개발 방식의 대표적인 예시입니다.