Rails - concept

uglyduck.dev·2022년 3월 26일
0

개념 모아 🗂

목록 보기
37/40

Rails App 구조

파일 구조가 복잡한 이유? 🙋

  • COC(Convention over Configuration)의 특징을 가지고 있기 때문에 구조를 이루는 요소 각각은 저마다 알맞는 역할을 수행하기 위해 준비됨

구조 설명

1. app/controllers

  • app 디렉토리의 하위 디렉토리인 controllers 안에 생성되는 파일은 Rails의 MVC 패턴에서 controller에 해당하는 코드가 담겨있음

2. app/views

  • app 디렉토리의 하위 디렉토리인 view에는 MVC 패턴에서 view에 해당하는 코드가 들어감. Rails에서는 view는 controller 내부의 action과 일대일 매칭되어 설정됨

3. app/models

  • app 디렉토리의 하위 디렉토리인 models는 Rails MVC 패턴에서 model 역할을 수행함. 내부적으로 설정된 데이터베이스와 연동되어서 관련 테이블을 class화 시킨 것이 model이라고 생각하면 됨

4. config/routes.rb

  • config 디렉토리에 포함되어 있는 routes.rb 파일은 클라이언트에서 요청하는 URL을 특정 controller의 action과 매칭함

5. db/migrate

  • 사용자가 model을 사용하려면 Rails 프로젝트와 연결된 데이터베이스에 실제로 테이블을 생성해야 함. 실제 테이블을 만들기 위한 코드들은 db 디렉토리의 하위 디렉토리인 migrate에 파일 형태로 생성.

6. db/schema.rb

  • 실제로 데이터베이스에 테이블이 생성되면 Rails 프로젝트의 db 디렉토리 하위에 생성되는 파일

7. vendor/Gemfile

  • Ruby에서 라이브러리를 Gem이라고 부르는데 vendor 디렉토리 하위에 포함되는 Gemfile에 작성하여 Rails 프로젝트에 추가할 수 있음.

첫 페이지 만들기


1단계 : Controller 생성

# 터미널 실행 후
& rails generate controller home
  • 여기서 generate는 g로 축약 가능함
  1. 명령어를 실행 → app/controllers/home_controller.rb 가 생성
  2. index action과 연결할 view 생성
    • app/views/home 디렉토리에서 위에서 생성한 index action과 동일한 이름을 가진 index.html.erd 파일 생성

    📌 html.erb 파일은 일반 html에 ruby 문법을 사용할 수 있도록 루비를 임베드함
    view 디렉토리의 하위 디렉토리는 controller 이름과 동일하게하고 디렉토리 안에 포함된 파일 이름은 action 이름과 동일하게 맞추면 자동으로 연결됨

2단계 : Controller 코드 작성

home_controller.rb

class HomeController < ApplicationController
    # 코드 추가 시작
  def index
  end
    # 코드 추가 끝
end
  • defend 사이에 있는 내용을 action이라고 부르며 이름이 동일한 view와 자동 매칭함
  • Rails에서 action서비스에서 동작할 수 있는 행동으로, 행동은 사용자가 볼 수 있는 페이지 또는 동작하는 하나의 로직이 될 수 있음

3단계 : View 코드 작성

index.html.erb

<h1>
    hello rails world!!
</h1>

4단계 : Route 설정

config/routes.rb

Rails.application.routes.draw do
    # 코드 시작
  get "home/index" => "home#index"
    # 코드 끝
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
  • 위 코드에서 get "home/index" => "home#index" 는 아래의 규칙을 기반으로 작성됨
  • [HTTP method] "uri" ⇒ "controller#action"

👄 "주어진 규칙을 통해 "home/index" 주소에 get 방식으로 요청하면 home 컨트롤러의 index action으로 연결하라"고 해석할 수 있음

"/" root 주소로 접근

config/routes.rb

Rails.application.routes.draw do
    # 코드 시작
  root "home#index"
    # 코드 끝
  get "home/index" => "home#index"
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
  • 위 코드에서 root "home#index"는 다음과 같은 규칙을 기반으로 작성됨
  • [root 주소] controller#action

👄 "root 주소, 즉 "/" 이 주소로 요청하면 home controller의 index action으로 보내라"는 의미

페이지 이동하기


페이지 이동 선행 설정

  1. route에서 두개의 다른 주소를 요청 받을 수 있도록 설정
  2. controller에서 두 개의 페이지를 만들 수 있도록 action 두 개 생성
  3. view에서 페이지를 서로 이동할 수 있게 a tag로 연결하기

2단계: controller에서 두 개의 페이지를 만들 수 있도록 action 두 개 생성


$ rails g controller home index next
  • rails g controller에 이어 controller 이름을 작성한 뒤 뒤이어 추가 이름 작성하면 그 이름들은 action 이름으로 지정됨

  • app/controllers/home_controller.rb 파일 생성

    class HomeController < ApplicationController
      # 자동 생성
      def index
      end

      def next
      end
    end	
  • controller와 action이 연결될 route 주소를 자동으로 설정
Rails.application.routes.draw do
  get 'home/index'
  get 'home/next'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

3단계: view에서 페이지를 서로 이동할 수 있게 a tag로 연결하기


  • route와 마찬가지로 controller를 만들 때 action을 함께 생성하면 해당 action과 매칭되는 view 또한 자동 생성됨

app/views/home/index.html.erb

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

<a href="/home/next">home/next로 이동</a>

app/views/home/next.html.erb

<h1>Home#next</h1>
<p>Find me in app/views/home/next.html.erb</p>

<a href="/home/index">home/index로 이동</a>
  • 페이지의 이동 링크의 각각의 주소는 우리가 route.rb에서 자동으로 생성한 주소로 만듦
  • config/routes.rb 파일 수정을 통해 root 설정
    Rails.application.routes.draw do
    	root 'home#index'
      get 'home/index'
      get 'home/next'
    end

서버로 데이터 전달


  1. form을 통해 서버(controller#action)로 데이터 전송
  2. action에 있는 데이터를 연결된 뷰로 전달하여 출력

1단계: 두개의 페이지(form, next) 생성

$ rails g controller home form next
  • 터미널을 실행하면 자동으로 routes, controller, view에서 form, next 설정이 완료

2단계: form view에서 next action으로 데이터 전송

app/views/home/form.html.erb

<h3>
	데이터 전송하기
</h3>

<form action="/home/next" method="GET">
	<input type="text" name="data_1">
	<button>
		제출
	</button>
</form>
  • config/routes.rb에 있는 get 'home/next' 코드로 인해 form에서 작성한 데이터는 home controller의 next action으로 전달됨

3단계: form에서 보낸 데이터를 next action에서 view로 전달

app/controllers/home_controller.rb

class HomeController < ApplicationController
  def form
  end

  def next
	 @data = params[:data_1]
  end
end
  • @data = params[:data_1]를 통해 form에서 보낸 데이터 수신
  • params는 클라이언트에서 보낸 요청 정보를 확인하는 메서드
  • params로 추출할 수 있는 데이터 params로 추출할 수 있는 데이터
    • 쿼리 파라미터의 경우 params를 통해 data를 추출함
    • @data 형태의 인스턴스 변수로 생성

4단계: next action에서 보낸 데이터 출력

app/views/home/next.html.erb

<h3>
	받은 데이터
</h3>

<p>
	<%= @data %>
</p>
  • <%= @data %>
    • <%= %> erb 파일에서 사용할 수 있는 문법으로 화면 출력이 가능함
  • next action에서 정의했던 @data는 next action과 view를 연결함으로써 view에서 사용할 수 있음

Reference

  • groomEdu 한 눈에 읽는 루비 온 레일즈
profile
시행착오, 문제해결 그 어디 즈음에.

0개의 댓글