Ruby On Rails 이해하기 #3 (CRUD 이해하기)

생성, 읽기, 업데이트, 삭제 등을 이해한다.

키워드 : 마이그레이션 파일, db:rake, action, method,

요약 :

<모델>

  • 모델을 만들기 ⇒ 어떤 데이터 타입으로 저장할 지, 하는 것!
  • 뷰 페이지에서, form으로 url, method 설정
  • 모델 마이그레이션
    • 실제 데이터를 저장할 때, 데이터 타입, 데이터 이름, 공개 여부 등을 다 설정해줘야 한다.

<데이터의 흐름>

  • 모델을 만들어서, 저장할 데이터 타입과 이름을 설정해준다.
  • config의 migrate 파일을 수정한다.
  • db를 migrate한다.
  • 뷰 페이지에서 사용자로부터 입력받은 데이터가 처리되도록 설정해준다.

실습


# 글을 생성하는 페이지와 read 페이지를 만든다. 
## controller에 create action 추가
## view file에 create.erb 추가
## routes.rb URL과 액션 추가

# 우선 모델을 만든다. 
rails g model Post

# form 태그 페이지
<a href="/practice/index">list post</a>

<form action="/practice/create" method="post">
  제목: <input type="text" name="title" /> <br />
  내용 : <input type="text" name="content" /><br />
  <input type="submit" />
</form>

모델 생성

키워드 : each do , create, param

요약 :

  • 모델 생성
    • migrate 파일 데이터 타입설정
    • db 마이그레이트
  • create
    • views create 정보입력받을 폼 만들기
    • controller action 만들기 create
    • routes.rb url, 액션연결하기
  • index
    • 정보 목록 보일 views 파일 수정

필기노트

#  모델 생성
rails g model Post

## DB -> migrate 폴더에 파일 생김
t.string :title
t.text :content

# 모델 쓰기
rake db:migrate

## controller에서 create 액션에 기록 코드 저장
def create
    post = Post.new
    post.title = params[:title]
    post.content = parmas[:content]
    post.save
		redirect_to '/practice/index'
end

## index에 모든 생성된 글을 보여주는 목록을 만든다. 
<%= @posts.each do |post| %> 
  <%= @post.title %> <br>
  <%= @post.content %> <br>
<% end %>

update와 destory 이해

키워드 : redirect_to "url", redirect_to :back , edit, Post.find

요약 :

  • edit
    • 컨트롤러에서 edit액션만들기, 특정 글을 선택
    • view 파일은 create와 비슷하게, 다만 form의 action, method 다르게
    • routes.rb 설정, /:post_id
  • 수정버튼 만들기
    • a 태그활용
    • view 파일설정
    • routes.rb 설정, /:post_id
  • 수정버튼 update 되도록 설정
    • a 태그 액션 바꾸기
  • 필기노트

실습

edit

```
# routes.rb edit 추가

# controller edit 액션추가

# view edit.erb 추가
create와 동일 하게 만듦

# index.erb에 수정 버튼만들기
```

수정파일 만들기

```
# controller edit action에서 수정
def edit
	@post = Post.find(params[:post_id])
end

## routes.rb 에서 url로 post_id정보를 전달
get '/practice/edit' => 'practice#edit'

## edit.erb 저장

<form action="/practice/create" method="post">
  제목: <input type="text" name="title" /> <br />
  내용 : <input type="text" name="content" /><br />
  <input type="submit" />
</form>
```

수정버튼 만들어서 수정 처리하기

```

# index.erb 파일에 수정버튼 만들기
<a href="/practice/edit"> 글수정</a><br />

# 컨트롤러에서 데이터 베이스에서 데이터 찾아서 채워주기
edit action
@post = Post.find(params[:post_id])

## routes.rb 수정 :post_id 정보 담아서 보내주도록
get '/practice/edit/:post_id' => 'practice#edit'

## index.erb 파일에서 post.id를 가져오도록 설정
<a href="/practice/edit/<%=post.id %>"> 

## edit.erb 파일 수정! 인스턴스변수 post를 가져와서 title,content를 가져온다. 
value="<%[email protected]%>"/> 
value="<%[email protected]%>"/>
```

수정한 내용을 저장한다.

```
# 컨트롤러에서 update 액션만들기
def update
      @post = Post.find(params[:post_id])
      post.title = params[:title]
      post.content = params[:content]
      post.save
      redirect_to '/practice/index'
end

## edit.erb 수정
<form action="/practice/update/<%[email protected]%>" method="post">

## 에러발생
NameError in PracticeController#update
undefined local variable or method `post' for #<PracticeController:0x00000000011af8>

## update에서는 edit action 처럼 @인스턴스 변수를 쓸 필요가 없다. 그 이유는 인스턴스 변수로, view 파일로 넘겨줄필요가 없기 때문이다. 

def update
      post = Post.find(params[:post_id])
      post.title = params[:title]
      post.content = params[:content]
      post.save
      redirect_to '/practice/index'
end
```

삭제하기

```
# 컨트롤러에 delete action 만들기
def delete
	Post.destroy(params[:post_id])
	redirect_to :back
end

# routes.rb에 연결해주기
get '/practice/delete/:post_id' => 'practice#delete'

# index.erb에 삭제버튼 만들기
<a href='/practice/delete/<%= post.id%>'>delete </a>

## redirect_to 대신에
redirect_back fallback_location: 'practice/index'
```

좋은 웹페이지 즐겨찾기