티스토리 뷰

Ruby On Rails

[Rails] CRUD without Scaffold

군옥수수수 2018. 2. 21. 00:56

CRUD without Scaffolding

CRUD 기능을 구현할 때 가장 중요한 것이 바로 라우팅 작업일 것입니다. 기본적이 라우팅 경로는 다음과 같습니다.

route.rb

  1. 경로와 해당 경로의 요청을 처리하는 컨트롤러와 액션의 이름이 같아면 액션은 따로 작성해주지 않아도 됩니다.

    1. Ex) 'posts/index' => 'posts#index' 컨트롤러-액션 생략
  2. new는 새로운 글을 작성하는 폼이 있는 페이지로 가는 것이기 때문에 get이고 create는 해당 폼에서 입력된 값들이 body에 담겨져 오면 해당 값들을 데이터베이스에 저장하는 역할을 하기 때문에 post를 통해 요청을 보냅니다.

Model

글을 작성하면 이를 저장하기 위한 데이터베이스 모델이 필요합니다. 다음 명령어를 통해 모델을 만들어 줍니다.

rails g model Post title:string content:text
  1. 컬럼명 : 데이터 타입 형식으로 원하는 모델의 속성을 나열해줍니다.
  2. 번외) 다른 언어들과는 다르게 String이 아닌 string으로 입력하셔야 합니다.

아직 모델이 완성된 것이 아닙니다. 이것은 일종의 이렇게 만들 것이다 라는 주문서와 같은 것이고 이제 실제로 주문서를 제출하고 모델을 만들라는 명령을 해주어야합니다.

rake db:migrate
  1. 위에서 String으로 입력했거나 등의 잘못된 주문서를 제출했다면 오류가 발생할 것입니다. 그렇다면 db/migrate/에 있는 파일들에서 오류에 대한 사항을 확인해보시기 바랍니다.
Controller

이제 사용자의 요청에 따른 처리를 해줄 컨트롤러를 생성합니다.

rails g controller Posts index show new create edit update destroy
  1. 컨트롤러를 생성할 때는 항상 복수형으로 작성해주셔야 합니다. 이외에도 Rails를 통해 모델이나 컨트롤러 등의 이름을 작명해줄 때는 일종의 규칙이 있습니다. 레일즈 작명 치트시트를 참고해주세요.
  2. Posts 컨트롤려 명 뒤에는 만들고 싶은 액션들을 나열해줍니다. 필수 사항은 아니지만 위의 예시처럼 나열해준다면 액션과 이에 해당하는 뷰들도 같이 생성해주기 때문에 편리합니다.

이제 본격적으로 CRUD를 만들어보도록 하겠습니다.

1. index - 글 목록

먼저 index.html.erb 에서는 글의 목록을 보여줄 것이고 이에 대한 처리는 index 액션에서 해주어야 합니다. 먼저 이에 앞서 샘플 데이터를 콘솔을 통해 넣겠습니다. 프로젝트의 루트 폴더로 들어가서 다음과 같은 명령어를 입력하고 데이터를 추가합니다.

rails c
Post.connection
Post.new(title: "title-1", content: "content-2").save
  1. rails c 는 레일즈의 콘솔에 접속한다는 의미입니다.
  2. Post 모델에 연결을 시도합니다.
  3. title-1content-2라는 예제 데이터를 넣고 저장합니다.

이제 본격적으로 액션을 작성해보도록 하겠습니다.

  1. @변수명을 통해 액션에서 뷰로 데이터를 넘겨줄 수 있고 Post의 모델의 모든 튜플(데이터)를 넘겨주기 위해서는 Post.all을 이용합니다.

  1. each do문을 통해 @posts에 담겨져 넘어온 데이터들을 하나씩 post에 담아 이를 출력해줍니다.
2. show - 글 보기

이젠 글을 상세히 보러 들어가보도록 하겠습니다. 어떤 글을 볼 것인가는 모델에 저장할 때 자동으로 부여되는 id 값을 이용해 접근할 것입니다. 위의 "보기" 버튼의 링크 주소를 보시면 클릭할 글의 데이터의 아이디가 경로에 포함되어 있습니다. 이렇게 내용을 보고싶은 글의 id를 넘기면 액션에서 받아서 적절히 처리해줍니다.

  1. show 액션에서 쿼리의 파라미터로 넘어온 id 값을 이용해 해당 데이터를 찾아 @post에 담아 뷰로 넘깁니다.

  1. 위와 같이 넘겨받은 @post를 사용해 titlecontent를 출력해줍니다.
3. new - 글 작성하기

지금 작성하는 CRUD에서는 new액션에서는 따로 넘겨주어야 할 것이 없습니다. 그렇기 때문에 new.html.erb를 작성하도록 하겠습니다.

  1. hidden_field_tag를 통해 보이지 않는 필드를 추가하고 여기에 인증 토큰을 넣어 글을 저장하는 액션으로 넘길 때 같이 넘깁니다. 레일즈에서는 위와 같이 post 액션에 대해서는 보안 토큰이 필요합니다. 이에 대해서는 추후에 자세히 다루도록 하겠습니다.

이젠 /posts/create로 넘겨진 데이터를 create 액션에서 처리하도록 하겠습니다.

  1. 바디에 담긴 titlecontent를 각각 params[:title]params[:content]를 통해 접근하여 이를 생성한 빈 데이터 박스인 @post에 넣고 .save를 통해 저장합니다.
  2. 저장 후 글의 목록으로 사용자를 보냅니다.
4. edit - 글 수정

이젠 글을 수정할 차례입니다. show.html.erb에 수정하기 버튼이 있고 수정하는 페이지의 요청 경로는 다음과 같습니다.

<a href="/posts/<%=@post.id%>/edit">수정</a>

수정은 edit 액션부터 작성해보도록 하겠습니다.

  1. /posts/:id/edit 경로로 접근하면 id에 해당하는 데이터를 먼저 찾고 edit.html.erb로 넘겨줍니다.

  1. 수정을 위해서는 먼저 수정하기 전의 데이터를 필드 위에 보여주어야 합니다. 위와 같이 필드를 넘어온 @post를 이용해 미리 채워둡니다.
  2. 여기서 새로 수정된 값들은 post메소드로 update 경로로 넘어가 update 액션이 처리하게 됩니다.
  3. new에서와 마찬가지로 post로 값을 넘기기 때문에 hidden_field_tag를 통해 인증 토큰을 넘겨주어야 합니다.

  1. create에서와는 다르게 @post = Post.find(params[:id]) 를 통해 수정해 줄 데이를 찾고 그 위에 새롭게 입력된 데이터를 덮어씁니다. @post = Post.new 를 하게 되면 새로운 데이터를 추가하는 것이기 때문에 수정과 맞지 않습니다.
  2. 덮어 쓰여진 데이터를 저장하고 해당 데이터의 상세 보기 페이지로 사용자를 보냅니다.
5. destroy - 삭제

글을 삭제하는 것을 마지막으로 기본적인 CRUD를 마무리하도록 하겠습니다.

show.html.erb의 삭제 버튼의 링크 경로를 보면 다음과 같습니다.

<a href="/posts/<%=@post.id%>/destroy">삭제</a>

먼저 액션을 코드를 작성해주도록 하겠습니다.

  1. 해당 경로로 접근을 하면 같이 넘어온 id 값으로 id에 해당하는 데이터를 지우고 사용자를 글의 목록을 보여주는 페이지로 보냅니다.


'Ruby On Rails' 카테고리의 다른 글

[Rails] OAuth2.0 with Google  (3) 2018.02.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함