- ์ค์ ๊ณผ์
- ORM์ด๋?
-
์ญํ ?
- ์๋น์ค ๋ก์ง ์ ๊ฐ์ง๊ณ ์์
-
๊ทธ๋์
app.rb
์์ ์์ฑํ๋ ๋ชจ๋ ๋ด์ฉ์ดController
์ ๋ค์ด๊ฐ -
Controller
๋ ํ๋์ ์๋น์ค์ ๋ํด์๋ง ๊ด๋ จํ๋ค.- ์๋ฅผ ๋ค์ด ๊ฒ์ํ์ ๊ธฐ๋ฅ ์ฝํธ๋กค๋ฌ๋ ๊ฒ์ํ ์ฝํธ๋กค๋ฌ
- ์ ๋ฐ์ดํธ๋ฅผ ๋ด๋นํ ๋๋ ์ ๋ฐ์ดํธ ์ฝํธ๋ด๋ก ๋ฌถ๋ ์
-
Controller
๋ฅผ ๋ง๋ค ๋์๋$ rails g controller ์ปจํธ๋กค๋ฌ๋ช
์ ์ด์ฉํ๋ค.
$ rails g controller home
# app/controllers/home_controller.rb ํ์ผ ์์ฑ
create app/controllers/home_controller.rb
invoke erb
create app/views/home
invoke test_unit
create test/controllers/home_controller_test.rb
invoke helper
create app/helpers/home_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/home.coffee
invoke scss
create app/assets/stylesheets/home.scss
app/controllers/home_controller.rb
class HomeController < ApplicationController
#์๋จ์ ์ฝ๋๋ ApplicationController๋ฅผ ์์๋ฐ๋ ์ฝ๋
end
# ์คํ ์ฝ๋
# $ rails s -b $IP -p $PORT
HomeController
๋ฅผ ๋ง๋ค๋ฉด app/views ํ์์ ์ปจํธ๋กค๋ฌ ๋ช ๊ณผ ์ผ์นํ๋ ํด๋๊ฐ ์๊ธด๋ค.HomeController
์์ ์ก์ (def
)์ ์์ฑํ๋ฉด ํด๋น ์ก์ ๋ช ๊ณผ ์ผ์นํ๋view
ํ์ผ์ app/views/home ํด๋ ๋ฐ์ ์์ฑํ๋ค.- ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ url ์ค์ ์ config/routes.rb์์ ํ๋ค.
Rails์๋ Development, Test, Production ํ๊ฒฝ(๋ชจ๋)๊ฐ ์๋ค.
Development ํ๊ฒฝ์์๋ ๋ณ๊ฒฝ์ฌํญ์ด ์๋์ ์ผ๋ก ํ์ธ๋๊ณ , ๋ชจ๋ ๋ก๊ทธ๊ฐ ์ฐํ๋ค.
Production ํ๊ฒฝ์์๋ ๋ณ๊ฒฝ์ฌํญ๋ ์๋์ ์ผ๋ก ์ ์ฅ๋์ง ์๊ณ , ๋ก๊ทธ๋ ์ผ๋ถ๋ง.
$ rails s
๋ก ์๋ฒ๋ฅผ ์คํํ์ง ์๋๋ค.
- ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ url ์ค์ ์ config/routes.rb์์ ํ๋ค.
- ์ฃผ์๋ฅผ ๋ฐ๋ ์ญํ ์ routes.rb์์ ๋ค ํ๋ค.
- get () do ํ์์ผ๋ก ์ ํด๋ ๋๋ค.
#Rails์๋ Development, Test, Productionํ๊ฒฝ(๋ชจ๋)๊ฐ ์๋ค. #Development ํ๊ฒฝ์์๋ ๋ณ๊ฒฝ์ฌํญ์ด ์๋์ ์ผ๋ก ํ์ธ๋๊ณ , ๋ชจ๋ ๋ก๊ทธ๊ฐ ์ฐํ๋ค. #Production ํ๊ฒฝ์์๋ ๋ณ๊ฒฝ์ฌํญ๋ ์๋์ ์ผ๋ก ์ ์ฅ๋์ง ์๊ณ , ๋ก๊ทธ๋ ์ผ๋ถ๋ง. `rails s`๋ก ์คํํ์ง ์๋๋ค.
- ์ ์ฌ๋ฉ๋ด๋ฅผ ๋๋ค์ผ๋ก ๋ณด์ฌ์ค๋ค.
- ๊ธ์ + ์ด๋ฏธ์ง๊ฐ ์ถ๋ ฅ๋๋ค.
- ์ ์ฌ๋ฉ๋ด๋ฅผ ์ ์ฅํ๋ ๋ณ์๋
Hash
ํ์ ์ผ๋ก ํ๋ค.- @lunch = { "์ ์ฌ๋ฉ๋ด ์ด๋ฆ" => "https://... .jpg"}
Hash
์์ ๋ชจ๋ key ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋.keys
์ด๋ค.
- ์์ฒญ์
/lunch
๋ก ๋ฐ๋๋ค.
#๋ชจ๋ธ ์์ฑ-๊ตฌ์กฐ๋ง(db/migrate์ 20180614021020_create_users.rb ์์ฑ)
$ rails g model ๋ชจ๋ธ๋ช
invoke active_record
create db/migrate/20180614021008_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
# ์ค์ DB์ ์คํค๋ง ํ์ผ๋๋ก ์ ์ฉํ๊ธฐ
$ rake db:migrate
$ rake db:drop # DB ๊ตฌ์กฐ๋ฅผ ์์ ํ์ ๊ฒฝ์ฐ drop์ ํตํด DB๋ฅผ ๋ ๋ฆฐ๋ค์ ๋ค์ migrate ํด์ค๋ค
$ rails c
Running via Spring preloader in process 3331
Loading development environment (Rails 5.0.7)
2.3.4 :001 > User.methods
#User ํ๋ ์์ฑ
2.3.4 :002 > User.new
=> #<User id: nil, username: nil, password: nil, created_at: nil, updated_at: nil>
#User์ ์ธ์คํด์ค ํ๋๋ฅผ u1์ ์ง์ด๋ฃ๋๋ค.
# ํ๋์ User๊ฐ ์๊ฒผ๋ค.
2.3.4 :003 > u1 = User.new
=> #<User id: nil, username: nil, password: nil, created_at: nil, updated_at: nil>
#u1์ ์ ์ฅํ๋ค.
2.3.4 :004 > u1.save
(0.2ms) begin transaction
SQL (1.4ms) INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2018-06-14 02:23:26.152735"], ["updated_at", "2018-06-14 02:23:26.152735"]]
(11.0ms) commit transaction
=> true
#๋๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ username์ ๊ฐ์ ์ง์ด๋ฃ๋๋ค.
2.3.4 :007 > u1.username = "haha"
=> "haha"
2.3.4 :008 > u1
=> #<User id: 1, username: "haha", password: nil, created_at: "2018-06-14 02:23:26", updated_at: "2018-06-14 02:23:26">
2.3.4 :008 > u1.save
- Rails๋ ORM(Object Relation Mapper)์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฅ์ฐฉํ๊ณ ์์(Active Record)
- migrate ํ์ผ์ ์ด์ฉํด์ DB์ ๊ตฌ์กฐ๋ฅผ ์ก์์ฃผ๊ณ ๋ช ๋ น์ด๋ฅผ ํตํด ์ค์ DB๋ฅผ ์์ฑ/๋ณ๊ฒฝ ํ๋ค.
- Model ํ์ผ์ ์ด์ฉํด์ DB์ ์๋ ์๋ฃ๋ฅผ ์กฐ์ํจ
> u1 = User.new # ๋น ๊ป๋ฐ๊ธฐ(ํ
์ด๋ธ์์ row ํ์ค)๋ฅผ ๋ง๋ ๋ค.
> u1.user_name = "haha" # ์๋ฃ์กฐ์
> u1.password = "1234"
> u1.save # ์ค์ DB์ ๋ฐ์(์ ์ฅ)
> u1.password = "4321"
> u1.save
- ์๋ก์ด ์ ์ ๋ฅผ ๋ฑ๋กํ๊ณ , ๋ณด์ฌ์ฃผ๋ ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ธ์ ๋ง๋ค์ด ๋ด ์๋ค.
$ rails g model user
$ rails g controller user
db/migrate/create_user.rb
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string "user_name"
t.string "password"
t.timestamps
end
end
end
app/controllers/ user_controller
class UserController < ApplicationController
def index
@users = User.all
end
def new
end
def create
u1 = User.new
u1.user_name = params[:user_name]
u1.password = params[:password]
u1.save
redirect_to "/user/#{u1.id}"
end
def show
@user = User.find(params[:id])
end
end
config/routes.rb
Rails.application.routes.draw do
get '/users' => 'user#index'
get '/user/new' => 'user#new'
get '/user/:id' => 'user#show'
post '/user/create' => 'user#create'
end
- route๋ฅผ ๋ฑ๋กํ ๋, wildcard ๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ฃผ์ํด์ผํ ์ ์ด ์๋๋ฐ,
/user/new
์ new๋ ํ๋์ id๋ก์ ์ธ์ํ๊ฒ ๋ ์ ์๋ค๋ ์ ์ด๋ค. ๊ทธ๋์ ๋ผ์ฐํ ์ ๋ฑ๋กํ ๋ ๋จผ์ /user/new
๋ฅผ ๋ฑ๋กํ๊ณ ๊ทธ ํ์/user/:id
๋ฅผ ๋ฑ๋กํ๋๋ก ํ๋ค.
app/views/user/index.html.erb
<ul>
<% @users.each do |user| %>
<li><%= user.user_name %></li>
<% end %>
</ul>
<a href="/user/new">์ ํ์๋ฑ๋ก</a>
app/views/user/show.html.erb
<h1><%= @user.user_name %></h1>
<p><%= @user.password %></p>
<a href="/users">์ ์ฒด์ ์ ๋ณด๊ธฐ</a>
app/views/user/new.html.erb
<form action="/user/create" method="POST">
<input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">
<input type="text" name="user_name" placeholder="ํ์์ด๋ฆ">
<input type="password" name="password" placeholder="๋น๋ฐ๋ฒํธ">
<input type="submit" value="๋ฑ๋กํ๊ธฐ">
</form>
- Rails์์๋ POST ๋ฐฉ์์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ๋(์๋ก์ด ์ ๋ณด๊ฐ ๋ฑ๋ก๋๋ ๊ฒฝ์ฐ) ๋ฐ๋์ ํน์ ํ ํฐ์ ํจ๊ป ๋ณด๋ด๊ฒ ๋์ด ์๋ค. ํ์๋ form_tag์ ๊ฐ์ ํน๋ณํ ๋ ์ผ์ฆ ๋ฌธ๋ฒ์ ํตํด ์ฝ๊ฒ ํ ํฐ์ ๋ณด๋ผ ์ ์์ง๋ง ์ง๊ธ ์์ ์์๋
form_authenticity_token
์ ํ์์ผ๋ก ํ ํฐ์ ๋ง๋ค์ด ๋ณด๋ด๋๋ก ํ๋ค.
- ๊ทธ๋์์ ๋ฝํ๋ ๋ด์ญ์ ์ ์ฅํด์ฃผ๋ ๋ก๋๋ฒํธ ์ถ์ฒ๊ธฐ
/lotto
=> ์๋ก ์ถ์ฒ๋ฐ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅa
ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์๋ก์ด ๋ฒํธ๋ฅผ ๋ฐ๊ธ- ์๋ก ๋ฐ๊ธ๋ ๋ฒํธ๊ฐ ๊ฐ์ฅ ๋ง์ง๋ง๊ณผ ์ต ์๋จ์ ๊ฐ์ด
- ์ต ์๋จ์ ๋ฉ์์ง๋
์ด๋ฒ์ฃผ ๋ก๋ ๋ฒํธ๋ [...] ์ ๋๋ค
/lotto/new
=> ์ ๊ท ๋ฒํธ๋ฅผ ๋ฐ๊ธ, ์ ์ฅ ํ/lotto
๋ก ๋ฆฌ๋๋ ์ - ๋ชจ๋ธ๋ช : Lotto
- ์ปจํธ๋กค๋ฌ๋ช : LottoController
$ rake db:migrate #ํ์ผ์ด ์๋ก ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ์ migrate๋ฅผ ํด๋ ๋ฌด๊ด(dropํ์ง ์๊ณ migrate๋ง ํ๋ ๊ฒฝ์ฐ์๋ ์๋ก ์๊ฒจ๋ migrationํ์ผ๋ง ์ ์ฉ์ด ๋๋ค.)
routes.rb
get '/lotto' => 'lotto#index' #lotto_cotroller์ index์ก์
์ผ๋ก
get '/lotto/new' => 'lotto#new' #lotto_cotroller์ new์ก์
์ผ๋ก
lotto_controller.rb
class LottoController < ApplicationController
def index
@new_number = Lotto.last
@numbers = Lotto.all
end
def new
number = (1..45).to_a.sample(6).sort.to_s
lotto = Lotto.new #Lotto๋ผ๋ ํด๋์ค์ ๊ป๋ฐ๊ธฐ ์์ฑ
lotto.numbers = number #numbers column์ number ์ ์ฅ
lotto.save #์ค์ ํ
์ด๋ธ์ ์ ์ฅ๋ ์ ์๋๋ก save
redirect_to "/lotto" #์์ฑ๋ํ /lotto๋ก ๋๋์๊ฐ๋ค.
end
end
- VIEW
lottoํด๋ ๋ฐ์ index.html.erb
: ์ก์ ๋ช ๊ณผ ํ์ผ์ด๋ฆ์ด ๊ฐ์์ผํ๋ค
$ rails g controller lotto
Running via Spring preloader in process 6415
create app/controllers/lotto_controller.rb
invoke erb
create app/views/lotto
invoke test_unit
create test/controllers/lotto_controller_test.rb
invoke helper
create app/helpers/lotto_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/lotto.coffee
invoke scss
create app/assets/stylesheets/lotto.scss
$ rails g model lotto
Running via Spring preloader in process 6404
invoke active_record
create db/migrate/20180614053528_create_lottos.rb
create app/models/lotto.rb
invoke test_unit
create test/models/lotto_test.rb
create test/fixtures/lottos.yml
- ๋ก๋๋ฒํธ ์ ๋ณด๋ฅผ ์ ์ฅํ
numbers
์ปฌ๋ผ์ ์ถ๊ฐํ๋ค.
db/migrate/create_lottos.rb
class CreateLottos < ActiveRecord::Migration[5.0]
def change
create_table :lottos do |t|
t.string "numbers"
t.timestamps
end
end
end
ํ๋์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์ ๋จผ์ ๋ชจ๋ธ๋ง(ํ ์ด๋ธ ๊ตฌ์กฐ)์ ๋ํด์ ์ง์ ํ๊ณ model์ relation์ ์ง์ ํ๋ค. ๊ทธ ์ดํ์ ์ด๋ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ ์ง ์ด๋ค ์ก์ ์ ์ฌ์ฉํ ์ง routes ํ์ผ์ ๋ช ์ํ ์ดํ์ controller ํ์ผ์ ์์ฑํ๋ ์์๋ก ํ๋ ๊ฒ์ด ์ข๋ค. ์ ํด์ง ๊ฒ์ ์๋๊ธฐ์ ๋ณธ์ธ์ด ํธํ ์์๋ก ํ๋ฉด ๋๋ค.
- ๋ผ์ฐํ ์ ์ค์ ํ๋ค
config/routes.rb
...
get '/lotto' => 'lotto#index'
get '/lotto/new' => 'lotto#new'
...
/lotto
์์๋ ์ ์ฒด ๋ฆฌ์คํธ์ ์๋ก ๋ฑ๋ก๋ ๋ฒํธ๋ฅผ ๋ณผ ๊ฒ์ด๊ณ ,/lotto/new
์์๋ ์๋ก์ด ๋ฒํธ๋ฅผ ์์ฑํ๊ณ ์ ์ฅํ ์ดํ์ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋/lotto
๋ก ๋ฆฌ๋๋ ์ ์์ผ์ค๋ค.
- controller logic
class LottoController < ApplicationController
def index
@new_number = Lotto.last
p @new_number.class
@numbers = Lotto.all
end
def new
number = (1..45).to_a.sample(6).sort.to_s
lotto = Lotto.new
lotto.numbers = number
lotto.save
redirect_to '/lotto'
end
end
- index์์๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ๋ฒํธ๋ฅผ ๋ถ๋ฌ์จ๋ค. ์ฌ๊ธฐ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ ๋ถ๋ถ์ ์ฒ์์๋ ์๋ฌด๋ฐ ์ ๋ณด๋ ์ ์ฅ๋์ด ์์ง ์๋ค๋ ์ ์ด๋ค.
- view
<p>์ด๋ฒ์ฃผ ์ถ์ฒ ์ซ์๋ <%= @new_number.numbers %> ์
๋๋ค. </p>
<a href="/lotto/new">์๋ฒํธ ๋ฐ๊ธ๋ฐ๊ธฐ</a>
<ul>
<% @numbers.each do |number| %>
<li><%= number.numbers %></li>
<% end %>
</ul>
- ์ต์ด ์ ์์
@new_number
๊ฐnil
์ด๊ธฐ ๋๋ฌธ์ url๋ก/lotto/new
๋ก ์ ์์ ์ฐ์ ์๋ํด์ ํ๋์ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.