This repository has been archived by the owner on Jan 7, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
getting_started.html
1756 lines (1591 loc) · 104 KB
/
getting_started.html
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Ruby on Rails Guides: 레일즈 시작하기</title>
<link rel="stylesheet" type="text/css" href="stylesheets/style.css" />
<link rel="stylesheet" type="text/css" href="stylesheets/print.css" media="print" />
<link rel="stylesheet" type="text/css" href="stylesheets/syntaxhighlighter/shCore.css" />
<link rel="stylesheet" type="text/css" href="stylesheets/syntaxhighlighter/shThemeRailsGuides.css" />
</head>
<body class="guide">
<div id="topNav">
<div class="wrapper">
<strong>More at <a href="http://rubyonrails.org/">rubyonrails.org:</a> </strong>
<a href="http://rubyonrails.org/">Overview</a> |
<a href="http://rubyonrails.org/download">Download</a> |
<a href="http://rubyonrails.org/deploy">Deploy</a> |
<a href="http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/overview">Code</a> |
<a href="http://rubyonrails.org/screencasts">Screencasts</a> |
<a href="http://rubyonrails.org/documentation">Documentation</a> |
<a href="http://rubyonrails.org/ecosystem">Ecosystem</a> |
<a href="http://rubyonrails.org/community">Community</a> |
<a href="http://weblog.rubyonrails.org/">Blog</a>
</div>
</div>
<div id="header">
<div class="wrapper clearfix">
<h1><a href="index.html" title="Return to home page">Guides.rubyonrails.org</a></h1>
<p class="hide"><a href="#mainCol">Skip navigation</a>.</p>
<ul class="nav">
<li><a href="index.html">홈</a></li>
<li class="index"><a href="index.html" onclick="guideMenu(); return false;" id="guidesMenu">목차</a>
<div id="guides" class="clearfix" style="display: none;">
<hr />
<dl class="L">
<dt>시작</dt>
<dd><a href="getting_started.html">레일즈 시작하기</a></dd>
<dt>모델(Models)</dt>
<dd><a href="migrations.html">레일즈 데이터베이스 마이그레이션</a></dd>
<dd><a href="active_record_validations_callbacks.html">액티브 레코드 데이터 검증(Validation)과 Callback(콜백)</a></dd>
<dd><a href="association_basics.html">액티브 레코드 Association(관계)</a></dd>
<dd><a href="active_record_querying.html">액티브 레코드 쿼리 인터페이스</a></dd>
<dt>뷰(Views)</dt>
<dd><a href="layouts_and_rendering.html">레이아웃(Layouts)과 렌더링(Rendering)</a></dd>
<dd><a href="form_helpers.html">액션 뷰 폼 핼퍼(Action View Form Helpers)</a></dd>
<dt>컨트롤러(Controllers)</dt>
<dd><a href="action_controller_overview.html">액션 컨트롤러 둘러보기</a></dd>
<dd><a href="routing.html">외부 요청에 대한 레일즈 라우팅</a></dd>
</dl>
<dl class="R">
<dt>심화내용</dt>
<dd><a href="active_support_core_extensions.html">액티브 서포트(Active Support) 확장(Core Extensions)</a></dd>
<dd><a href="i18n.html">레일즈 국제화I(nternationalization) API</a></dd>
<dd><a href="action_mailer_basics.html">액션 메일러의 기본</a></dd>
<dd><a href="testing.html">레일즈 어플리케이션 테스트하기</a></dd>
<dd><a href="security.html">레일즈 어플리케이션의 보안</a></dd>
<dd><a href="debugging_rails_applications.html">레일즈 어플리케이션 디버깅</a></dd>
<dd><a href="performance_testing.html">레일즈 어플리케이션 성능 테스트하기</a></dd>
<dd><a href="configuring.html">레일즈 어플리케이션 설정</a></dd>
<dd><a href="command_line.html">레일즈 커멘드라인 도구와 Rake 테스크</a></dd>
<dd><a href="caching_with_rails.html">레일즈를 이용한 캐싱</a></dd>
<dt>레일즈 확장하기(Extending Rails)</dt>
<dd><a href="plugins.html">레일즈 플러그인 작성의 기본</a></dd>
<dd><a href="rails_on_rack.html">렉 위의 레일즈(Rails on Rack)</a></dd>
<dd><a href="generators.html">레일즈 제너레이터(Generator) 제작과 수정</a></dd>
<dt>루비 온 레이즈에 기여하기</dt>
<dd><a href="contributing_to_ruby_on_rails.html">루비 온 레이즈에 기여하기</a></dd>
<dd><a href="api_documentation_guidelines.html">API 문서 가이드라인</a></dd>
<dd><a href="ruby_on_rails_guides_guidelines.html">루비 온 레일즈 가이드에 대한 가이드라인</a></dd>
<dt>Release Notes</dt>
<dd><a href="3_0_release_notes.html">Ruby on Rails 3.0 Release Notes</a></dd>
<dd><a href="2_3_release_notes.html">Ruby on Rails 2.3 Release Notes</a></dd>
<dd><a href="2_2_release_notes.html">Ruby on Rails 2.2 Release Notes</a></dd>
</dl>
</div>
</li>
<li><a href="contribute.html">기여하기</a></li>
<li><a href="credits.html">수고하신 분들</a></li>
</ul>
</div>
</div>
<hr class="hide" />
<div id="feature">
<div class="wrapper">
<h2>레일즈 시작하기</h2>
<p>이 가이드는 루비 온 레일즈를 설치, 실행을 다룹니다. 이 문서를 읽고나면 여러분은 다음 내용을 알 수 있습니다.</p>
<ul>
<li>레일즈 설치, 새로운 레일즈 어플리케이션 만들기, 데이터베이스 연결하기</li>
<li>레일즈 어플리케이션의 일반적인 레이아웃</li>
<li><acronym title="모델, 뷰, 컨트롤러"><span class="caps">MVC</span></acronym>와 RESTful 디자인에 대한 기본원리</li>
<li>레일즈 어플리케이션 시작 요소 빨리 만드는 방법</li>
</ul>
<div id="subCol">
<h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
<ol class="chapters">
<li><a href="#Rails-Assumptions">이 가이드를 시작하기 위해서</a></li><li><a href="#What-is-Rails">레일즈란 무엇인가?</a><ul><li><a href="#The-MVC-Architecture"><span class="caps">MVC</span> 아키텍쳐</a></li> <li><a href="#The-Components-of-Rails">레일즈의 컴포넌트</a></li> <li><a href="#rest"><span class="caps">REST</span></a></li></ul></li><li><a href="#Creating-a-New-Rails-Project">새로운 레일즈 프로젝트 만들기</a><ul><li><a href="#Installing-Rails">레일즈 설치하기</a></li> <li><a href="#Creating-the-Blog-Application">블로그 어플리케이션 만들기</a></li> <li><a href="#Installing-the-Required-Gems">필요한 젬 설치하기</a></li> <li><a href="#Configuring-a-Database">데이터베이스 설정</a></li> <li><a href="#Creating-the-Database">데이터베이스 생성</a></li></ul></li><li><a href="#Hello-Rails">Hello, Rails!</a><ul><li><a href="#Starting-up-the-Web-Server">웹서버 시작하기</a></li> <li><a href="#Say-Hello-Rails">“Hello”, Rails 라고 말하기</a></li></ul></li><li><a href="#Getting-Up-and-Running-Quickly-with-Scaffolding">발판(Scaffolding)을 이용해서 빠르게 시작하기</a></li><li><a href="#Creating-a-Resource">리소스 만들기</a><ul><li><a href="#Running-a-Migration">마이그레이션 실행하기</a></li> <li><a href="#Adding-a-Link">링크 추가</a></li> <li><a href="#Working-with-Posts-in-the-Browser">브라우저에서 Posts 작업</a></li> <li><a href="#The-Model">모델</a></li> <li><a href="#Adding-Some-Validataion">몇 가지 데이터 검증(Validation) 추가하기</a></li> <li><a href="#Using-the-Console">콘솔 사용하기</a></li> <li><a href="#Listing-All-Posts">모든 글(Posts) 목록 보기</a></li> <li><a href="#Customizing-the-Layout">레이아웃 수정하기(Customizing)</a></li> <li><a href="#Creating-New-Posts">새 포스트 만들기</a></li> <li><a href="#Showing-an-Individual-Post">각각의 글 보여주기</a></li> <li><a href="#Destroying-a-Post">글 지우기</a></li></ul></li><li><a href="#Adding-a-Second-Model">두번째 모델 추가하기</a><ul><li><a href="#Generating-a-Model">모델 만들기</a></li> <li><a href="#Associating-Models">모델 관계 설정하기</a></li> <li><a href="#Adding-a-Route-for-Comments">댓글(Comments)를 위한 라우팅 규칙 추가하기</a></li> <li><a href="#Generating-a-Controller">컨트롤러 만들기</a></li></ul></li><li><a href="#Refactoring">리펙토링(Refactoring)</a><ul><li><a href="#Rendering-Partial-Collections">조각(partial) 뷰 컬렉션 렌더링하기</a></li> <li><a href="#Rendering-a-Partial-Form">조각(partial) 폼 렌더링하기</a></li></ul></li><li><a href="#Deleting-Comments">댓글(Comment) 지우기</a><ul><li><a href="#Deleting-Associated-Objects">관계된 객체 삭제하기</a></li></ul></li><li><a href="#Security">보안</a></li><li><a href="#Building-a-Multi-Model-Form">다중-모델(Multi-Model) 폼 만들기</a></li><li><a href="#View-Helpers">뷰 헬퍼</a></li><li><a href="#What-Next">다음에는 무엇?</a></li><li><a href="#Configuration-Gotchas">설정 사로 잡기(Configuration Gotchas)</a></li><li><a href="#changelog">Changelog</a></li><li><a href="#changelog-for-korean-translation">Changelog for Korean Translation</a></li></ol></div>
</div>
</div>
<div id="container">
<div class="wrapper">
<div id="mainCol">
<div class='warning'><p>이 가이드는 레일즈 3.0에 기초합니다. 기존 버전의 레일즈에서는 이 문서의 코드가 동작하지 않을 수 있습니다.</p></div>
<div class='warning'><p>이 가이드의 원본은 영문 버전인 <a href="http://guides.rubyonrails.org/getting_started.html">Getting Started with Rails</a> 입니다. 번역 과정에서 원본과 차이가 발생할 수 있습니다. 번역본은 원본의 참고로 생각해 주세요.</p></div>
<h3 id="Rails-Assumptions">1 이 가이드를 시작하기 위해서</h3>
<p>이 가이드는 레일즈 어플리케이션을 처음으로 시작하는 초보자 분들을 위해 구성되어 있습니다. 이 문서는 레일즈 경험이 전혀 없다고 가정합니다. 그러나 미리 준비 할 몇 가지가 있습니다.</p>
<ul>
<li><a href="http://www.ruby-lang.org/en/downloads">루비</a> 언어 버전 1.8.7 이상</li>
</ul>
<div class='info'><p>루비 버전 1.8.7 p248 과 p249 는 레일즈 3.0을 중단 시키는 마샬링 버그를 포함하고 있습니다. Ruby Enterprise Edition 은 1.8.7-2010.02 이후 버전부터 이 문제가 해결되었습니다. 루비 1.9 버전에서, 1.9.1 에서 레일즈 3.0을 사용하면 세그먼트 실패(segment fault)가 발생합니다. 그래서 레일즈 3.0과 1.9.x를 사용하려면 1.9.2를 이용하세요.</p></div>
<ul>
<li><a href="http://rubyforge.org/frs/?group_id=126" title="RubyGems">루비젬</a> 패키징 시스템</li>
<li><a href="http://www.sqlite.org">SQLite3 데이터베이스</a></li>
</ul>
<p>레일즈는 루비 프로그램 언어에서 동작하는 웹 어플리케이션 프레임워크 입니다. 루비에 대한 경험이 없어도, 레일즈를 매우 빠르게 학습 할 수 있습니다. 다음은 인터넷에서 루비 언어를 배울 수 있는 좋은 무료 문서입니다.</p>
<ul>
<li><a href="http://www.humblelittlerubybook.com">Mr. Neighborly’s Humble Little Ruby Book</a></li>
<li><a href="http://www.ruby-doc.org/docs/ProgrammingRuby/">Programming Ruby</a></li>
<li><a href="http://mislav.uniqpath.com/poignant-guide/">Why’s (Poignant) Guide to Ruby</a></li>
</ul>
<h3 id="What-is-Rails">2 레일즈란 무엇인가?</h3>
<p>레일즈는 루비 언어로 작성된 웹 어플리케이션 프레임워크 입니다. 레일즈는 모든 개발자가 개발을 시작 할때 필요한 초기 준비나 가정들을 쉽게 만들수 있는 도구를 제공하여, 웹 어플리케이션 프로그래밍을 더 쉽게 만들수 있도록 설계 되어 있습니다. 레일즈는 다른 언어와 프레임웍에 비해서 더 적은 코드로 작성됩니다. 레일즈를 경험한 개발자들은 웹 어플리케이션 개발이 좀 더 재미있다고 이야기합니다.</p>
<p>레일즈는 주장이 확실한 소프트웨어 입니다. 레일즈는 "최고"의 방법을 가정하고, 그러한 방법을 격려하도록 설계되어 있습니다. 여러분이 “레일즈의 방법(The Rails Way)” 배우면, 아마도 굉장한 생산성 향상을 발견하실 겁니다. 다른 언어의 개발 습관들을 레일즈 개발시 고수하고 있다면, 아마 덜 행복한 경험을 하실 겁니다.</p>
<p>레일즈의 철학은 몇 가지 원칙을 포함합니다.</p>
<ul>
<li><span class="caps">DRY</span> – “Don’t Repeat Yourself (반복하지 말 것)” – 이 원칙은 ‘같은 코드가 존재한다면 그것은 나쁜 것’을 의미합니다.</li>
<li>설정 보다 관습(Convention Over Configuration) – 이 원칙은 여러분이 원하는 기능들에 대해서 일정한 가정을 바탕으로 해결책을 제공하여 작은 단위의 끝없는 설정 파일을 줄여줍니다.</li>
<li><span class="caps">REST</span> 는 웹 어플리케이션의 최고의 패턴이다.- 리소스와 표준 <span class="caps">HTTP</span> 요청(<span class="caps">HTTP</span> verb)에 적합한 웹 어플리케이션 개발은 가장 빠른 방법입니다.</li>
</ul>
<h4 id="The-MVC-Architecture">2.1 <span class="caps">MVC</span> 아키텍쳐</h4>
<p>레일즈의 중심에는 <span class="caps">MVC</span> 라고 불리는 모델, 뷰, 컨트롤러 아키텍쳐가 있습니다. MVC의 장점은 다음과 같습니다.</p>
<ul>
<li>유저 인터페이스와 비지니스 로직 분리</li>
<li><span class="caps">DRY</span> 유지 편이성</li>
<li>더 쉬운 유지보스를 위한 코드 관리 편이성</li>
</ul>
<h5 id="Models">2.1.1 모델(Models)</h5>
<p>모델은 어플리케이션의 정보(data)와 데이터를 다루는 규칙들을 의미합니다. 레일즈의 경우에, 모델은 주로 데이터베이스 데이블과 상호 작용하는 규칙들을 관리합니다. 대부분의 경우에 데이터베이스의 하나의 테이블은 어플리케이션의 하나의 모델과 대응합니다. 대부분의 비지니스 로직은 모델에 집중됩니다.</p>
<h5 id="Views">2.1.2 뷰(Views)</h5>
<p>뷰는 어플리케이션의 유저 인터페이스를 의미합니다. 레일즈에서 뷰는 주로 데이터 표현에 관련 된 루비 코드가 삽입되어 있는 <span class="caps">HTML</span> 파일입니다. 뷰는 데이터를 웹 브라우저나 다른 기기에게 데이터를 제공하는 일을 담당합니다.</p>
<h5 id="Controllers">2.1.3 컨트롤러(Controllers)</h5>
<p>컨트롤러는 모델과 뷰를 "연결"하는 역할을 합니다. 레일즈에서 컨트롤러는 웹브라우저의 요청 받아서, 모델을 통해서 데이터를 조회하여, 출력을 위해 뷰에게 데이터를 넘겨줍니다.</p>
<h4 id="The-Components-of-Rails">2.2 레일즈의 컴포넌트</h4>
<p>레일즈는 많은 개발 컴포넌트와 함께 제공됩니다.</p>
<ul>
<li>Action Pack
<ul>
<li>Action Controller</li>
<li>Action Dispatch</li>
<li>Action View</li>
</ul></li>
<li>Action Mailer</li>
<li>Active Model</li>
<li>Active Record</li>
<li>Active Resource</li>
<li>Active Support</li>
<li>Railties</li>
</ul>
<h5 id="Action-Pack">2.2.1 액션 팩(Action Pack)</h5>
<p>액션 팩은 액션 컨트롤러과 액션 뷰를 포함하는 젬입니다. "MVC"에서 "VC"부분 입니다.</p>
<h5 id="Action-Controller">2.2.2 액션 컨트롤러(Action Controller)</h5>
<p>액션 컨트롤러는 레일즈 어플리케이션에서 컨트롤러를 담당하는 컴포넌트 입니다. 액션 컨트롤러 프레임워크는 레일즈 어플리케이션으로 들어오는 요청을 처리하고, 파라미터를 추출하고, 의도된 액션으로 보냅니다. 액션 컨트롤러는 세션(session)관리, 템플릿(template) 렌더링, 리다이렉트(redirect) 관리 서비스를 포함합니다.</p>
<h5 id="Action-View">2.2.3 액션 뷰(Action View)</h5>
<p>액션 뷰는 레일즈 어플리케이션의 뷰를 관리합니다. 기본적으로 <span class="caps">HTML</span>, XML을 만들수 있습니다. 엑션 뷰는 템플릿 렌더링, 중첩 폼(Nested), 조각(Partial) 템플릿, <span class="caps">AJAX</span> 지원을 관리합니다.</p>
<h5 id="Action-Dispatch">2.2.4 액션 디스패치(Action Dispatch)</h5>
<p>액션 디스패치는 웹의 요청을 받아들여서 원하는 곳으로 연결시킵니다.(다른 Rack 어플리케이션과 동일)</p>
<h5 id="Action-Mailer">2.2.5 액션 메일러(Action Mailer)</h5>
<p>액션 메일러는 내장된 이메일 서비스 프레임워크 입니다. 엑션 메일러를 이용해서 유연한 템플릿을 기반으로 간단한 텍스트 부터 복잡한(multipart) 메일을 처리할수 있습니다.</p>
<h5 id="Active-Model">2.2.6 액티브 모델(Active Model)</h5>
<p>액티브 모델은 액션 팩(Action Pack) 서비스와 <acronym title="Object Relation Mapping"><span class="caps">ORM</span></acronym> 젬과 인터페이스를 정의합니다.(ORM으로, 액티브 레코드(Active Record)가 있습니다.) 액티브 모델은 여러분이 원한다면, 다른 <span class="caps">ORM</span> 프레임워크를 사용할 수 있게 합니다.</p>
<h5 id="Active-Record">2.2.7 액티브 레코드(Active Record)</h5>
<p>액티브 레코드는 레일즈 어플리케이션에서 모델의 기초입니다. 액티브 레코드는 데이터베이스 추상화와 기본 <span class="caps">CRUD</span> 기능, 고급 검색 능력과 객체들 간의 관계를 정의하는 기능을 제공합니다.</p>
<h5 id="Active-Resource">2.2.8 액티브 리소스(Active Resource)</h5>
<p>액티브 리소스는 비지니스 객체와 RESTful 웹 서비스간의 연결 관리를 위한 프레임워크 입니다. 액티브 리소스는 웹 기반의 자원을 로컬 객체의 <span class="caps">CRUD</span> 처럼 매핑시킵니다.</p>
<h5 id="Active-Support">2.2.9 액티브 서포트(Active Support)</h5>
<p>액티브 서포트는 레일즈가 사용하는 유틸리티 클레스와 표준 루비 확장 모음입니다.</p>
<h5 id="Railties">2.2.10 레일티즈(Railties)</h5>
<p>레일티즈는 새로운 레일즈 어플리케이션을 만들고 다양한 프레임워크와 플러그인을 이어주는 레일즈의 핵심 코드입니다.</p>
<h4 id="rest">2.3 <span class="caps">REST</span></h4>
<p>REST는 Representational State Transfer 를 의미하고 RESTful 아키택쳐의 근간이 됩니다. REST는 Roy Fielding의 박사의 이론, <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">Architectural Styles and the Design of Network-based Software Architectures</a> 에서 논의되었습니다. 여러분이 저 문서에서 읽을 수 있는 내용 중에서, 레일즈의 존재하는 <span class="caps">REST</span> 두가지 중요한 원리는 다음과 같습니다.:</p>
<ul>
<li>자원 표현을 위해 자원 식별자 사용 (가령 <span class="caps">URL</span>)</li>
<li>시스템 컴포넌트 간에 자원 상태 교환</li>
</ul>
<p>예제로, 레일즈 어플리케이션에서 요청은 다음과 같습니다.</p>
<p><tt><span class="caps">DELETE</span> /photos/17</tt></p>
<p>이 것은 photo 리소스 ID 17번 참조하고, 원하는 액션은 삭제라고 이해할 수 있습니다. REST는 웹 어플리케이션의 아키텍쳐상 자연스로운 형태이고, 레일즈는 어플리케이션을 RESTful 복잡성과 브라우저의 변덕스러운 요청에서 보호합니다.</p>
<p>REST를 아키텍쳐 관점에서 자세히 알고 싶다면 다음의 자료 참고하세요.</p>
<ul>
<li><a href="http://www.infoq.com/articles/rest-introduction">A Brief Introduction to <span class="caps">REST</span></a> by Stefan Tilkov</li>
<li><a href="http://bitworking.org/news/373/An-Introduction-to-REST">An Introduction to <span class="caps">REST</span></a> (video tutorial) by Joe Gregorio</li>
<li><a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">Representational State Transfer</a> article in Wikipedia</li>
<li><a href="http://www.infoq.com/articles/webber-rest-workflow">How to <span class="caps">GET</span> a Cup of Coffee</a> by Jim Webber, Savas Parastatidis & Ian Robinson</li>
</ul>
<h3 id="Creating-a-New-Rails-Project">3 새로운 레일즈 프로젝트 만들기</h3>
<p>이 가이드를 따라가면, 여러분은 <tt>blog</tt>라는 이름의 (매우) 단순한 웹블로그 레일즈 프로젝트를 만들게 될 것 입니다. 어플리케이션을 만들기 전에, 먼저 레일즈 그 자체를 설치하는 절차가 필요하죠.</p>
<h4 id="Installing-Rails">3.1 레일즈 설치하기</h4>
<p>대부분의 경우, 가장 쉬운 레일즈 설치는 RubyGem을 통하는 방법입니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
보통 root 유저로 이를 실행합니다.
# gem install rails
</pre>
</div>
</notextile>
<div class='info'><p>만약 윈도우 상에서 작업 중이라면, 레일즈 개발 대다수가 유닉스(Unix) 환경에서 이루어지고 있다는걸 생각해 주세요. 루비 온 레일즈를 <a href="http://rubyinstaller.org/">루비 인스톨러</a> 같은 방법으로 손쉽게 설치할지라도, 레일즈 생태계는 여러분이 C 기반의 루비젬과 명령행(command) 기반의 환경에서 작업한다고 가정합니다. 가능하다면, 윈도우 대신에 Linux 가상 머신에 레일즈 설치하고 사용하는 것을 권장합니다.</p></div>
<h4 id="Creating-the-Blog-Application">3.2 블로그 어플리케이션 만들기</h4>
<p>이 가이드를 이용하는 가장 좋은 방법은 단계에 기술된 대로, 따라가는 것 입니다. (코드가 없는 부분, 예제 어플리케이션이 없는 부분도 마찬가지 입니다.) 작성 된대로 각 단계를 따라갈 수 있습니다. 완성된 코드가 필요하면, <a href="http://github.com/mikel/getting-started-code">Getting Started Code</a> 에서 다운로드 받으세요.</p>
<p>시작하기 위해 터미널을 여시고 파일을 만들고자 하는 폴더로 이동해서 다음을 입력하세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rails new blog
</pre>
</div>
</notextile>
<p>이 명령은 ‘블로그(Blog)’ 레일즈 어플리케이션을 blog 디렉토리에 만들 것입니다.</p>
<div class='info'><p>레일즈 어플리케이션 생성에 대한 모든 스위치(옵션)들은 <tt>rails new -h</tt>로 확인할 수 있습니다.</p></div>
<p>blog 어플리케이션을 만들고 난후 해당 폴더로 작업을 위해 해당 폴더로 이동합니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ cd blog
</pre>
</div>
</notextile>
<p>레일즈는 <tt>blog</tt>라는 작업 디렉토리를 만듭니다. 이 폴더를 열고 내용을 살펴보세요. 이 튜토리얼의 대부분의 작업은 <tt>app</tt> 폴더 내부에서 이루어 집니다. 하지만 아래에 내용은 새로운 플리케이션을 위해서 레일즈가 기본 생성한 각각의 폴더가 어떤 기능을 가지는지 설명합니다.</p>
<table>
<tr>
<th>파일/폴더</th>
<th>목적</th>
</tr>
<tr>
<td>Gemfile</td>
<td>이 파일은 여러분의 레일즈 어플리케이션에게 필요한 젬의 의존성 정보를 기술하는데 사용됩니다.</td>
</tr>
<tr>
<td><span class="caps">README</span></td>
<td>이 파일은 어플리케이션을 위한 짧막한 설명입니다. 설치, 사용 방법 기술에 쓰입니다.</td>
</tr>
<tr>
<td>Rakefile</td>
<td>이 파일은 터미널에서 실행할 수 있는 배치잡들을 포함합니다.</td>
</tr>
<tr>
<td>app/</td>
<td>어플리케이션을 위한 컨트롤러, 모델, 뷰를 포함합니다. 이 가이드에서는 이 폴더에 집중할 것 입니다. </td>
</tr>
<tr>
<td>config/</td>
<td>어플리케이션의 실행 시간의 규칙, 라우팅, 데이터베이스 등 설정을 저장합니다. </td>
</tr>
<tr>
<td>config.ru</td>
<td>랙(Rack) 기반의 서버들이 시작할때 필요한 설정 입니다. </td>
</tr>
<tr>
<td>db/</td>
<td>현재 데이터베이스의 스키마를 볼 수 있습니다.(데이터베이스 마이그레이션으로 잘 알려져 있습니다.) 여러분은 마이그레이션에 대해서 간단하게 배우게 됩니다.</td>
</tr>
<tr>
<td>doc/</td>
<td>어플리케이션에 대한 자세한 설명 문서입니다.</td>
</tr>
<tr>
<td>lib/</td>
<td>어플리케이션을 위한 확장 모듈입니다. (이 문서에서 다루지 않습니다.)</td>
</tr>
<tr>
<td>log/</td>
<td>어플리케이션의 로그 파일입니다.</td>
</tr>
<tr>
<td>public/</td>
<td>외부에서 볼수 있는 유일한 폴더 입니다.이미지, 자바스크립트, 스타일시트나 그외 정적인 파일들은 이곳에 두세요. </td>
</tr>
<tr>
<td>script/</td>
<td>레일즈 스크립트를 포함합니다. 여러분의 어플리케이션을 실행시키거나, 배포, 실행 관련한 스크립트를 두세요.</td>
</tr>
<tr>
<td>test/</td>
<td>유닛 테스트, 픽스쳐, 그와 다른 테스트 도구들 입니다. 이 부분은 <a href="testing.html">레일즈 어플리케이션 테스트하기</a> 가 담당합니다.</td>
</tr>
<tr>
<td>tmp/</td>
<td>Temporary files</td>
</tr>
<tr>
<td>tmp/</td>
<td>임시 파일</td>
</tr>
<tr>
<td>vendor/</td>
<td>서드 파티 코드들을 위한 공간입니다. 일반적인 레일즈 어플리케이션은 루비 젬과 레일즈 소스-프로젝트 내에 설치시-와 미리 패키징된 추가 플러그인들이 위치합니다. </td>
</tr>
</table>
<h4 id="Installing-the-Required-Gems">3.3 필요한 젬 설치하기</h4>
<p>레일즈 어플리케이션을 젬의 의존성을 기본적으로 <a href="http://gembundler.com/v1.0/index.html" title="Bundler">번들러</a> 를 통해서 관리합니다. 생성된 <tt>Gemfile</tt> 에 기술된 젬 외에 다른 젬은 필요없습니다. 다음의 명령을 직접 실행할 수 있습니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
# bundle install
</pre>
</div>
</notextile>
<p>이제 준비되었습니다.</p>
<h4 id="Configuring-a-Database">3.4 데이터베이스 설정</h4>
<p>모든 레일즈 어플리케이션은 데이터베이스와 통신하게 됩니다. 데이터페이스의 사용하기 위해서 <tt>config/database.yml</tt> 설정 파일이 필요합니다.
새로운 레일즈 어플리케이션에서 이 파일을 열어보면, SQLite3 기본 데이터베이스로 설정되어 있는걸 볼 수 있습니다.기본적값으로 레일즈상에서 이 파일은 세가지의 환경 설정으로 구성되어 있습니다. :</p>
<ul>
<li><tt>development</tt>(개발) 환경은 여러분의 개발 컴퓨터에서 사용됩니다.</li>
<li><tt>test</tt>(테스트) 환경은 자동화된 테스트를 위해 사용됩니다.</li>
<li><tt>production</tt>(제품) 환경은 어플리케이션을 실제 서비스에 배포할때 사용됩니다.</li>
</ul>
<h5 id="Configureing-an-SQLite3-Database">3.4.1 SQLite3 데이터베이스 설정하기</h5>
<p>레일즈는 가볍고 별도의 서버가 필요하지 않은 <a href="http://www.sqlite.org">SQLite3</a> 내장해서 배포됩니다. 바쁜 실제 서비스 환경에서 SQLite는 부족하지만, 개발하거나 테스트하는 환경에서는 충분합니다. 새로운 프로젝트를 생성할때 레일즈는 SQLite 를 기본값으로 삼지만, 언제든지 나중에 변경할 수 있습니다.</p>
<p>여기에 기본 설정 파일(<tt>config/database.yml</tt>)의 development(개발) 환경 접속 정보가 있습니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
</pre>
</div>
</notextile>
<div class='note'><p>이 가이드에서는 데이터 저장을 위해서 SQLite3 데이터베이스를 사용합니다. 왜냐하면, 데이터베이스를 위한 특별한 설정이 필요없기 때문이죠. 물론, 레일즈는 MySQL과 PostgreSQL도 별도로 지원합니다. 그리고 많은 데이터베이스 시스템을 플러그인으로 지원합니다. production(제품) 환경에서 데이터베이스를 사용하기 위해, 레일즈는 대부분의 어탭터(adapter) 가지고 있습니다.</p></div>
<h5 id="Configuring-a-MySQL-Database">3.4.2 MySQL 데이터베이스 설정</h5>
<p>레일즈와 함께 제공되는 SQLite3 데이터베이스 대신에 MySQL을 사용하려면, <tt>config/database.yml</tt>을 아래와 같이 약간 다른 모습으로 변경해야합니다. development(개발) 환경 부분 설정예제 입니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
development:
adapter: mysql2
encoding: utf8
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
</pre>
</div>
</notextile>
<p>개발 컴퓨터의 MySQL 설치본이 root 사용자를 가지고 암호가 비어 있다면, 이 설정은 유효하게 동작합니다. 그렇지 않다면, username과 password 를 환경에 맞게 변경해 주세요.</p>
<h5 id="Configuring-a-PostgreSQL-Database">3.4.3 PostgreSQL 데이터베이스 설정</h5>
<p>마지막으로, PostgreSQL 사용을 선택했다면, <tt>config/database.yml</tt>를 PostgreSQL에 적합하게 수정해주세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
username: blog
password:
</pre>
</div>
</notextile>
<p>마찬가지로 username과 password를 <tt>development</tt>(개발) 환경에 맞도록 변경하세요.</p>
<div class='info'><p>데이터베이스의 설정들을 수동으로 갱신할 필요는 없습니다. 어플리케이션 제너레이터의 설정에서 <tt>—database</tt> 항목을 읽어보세요. 이 설정들은 주로 사용되는 관계형 데이터베이스 어뎁터 설정에 도움을 줍니다. 반복해서 <tt>cd .. && rails new blog —database=mysql</tt> 명령을 실행할 수 있습니다. <tt>config/database.yml</tt> 파일 덮어쓰기를 허용하면 어플리케이션을 SQLite 대신에 MySQL 로 설정할 수 있습니다.</p></div>
<h4 id="Creating-the-Database">3.5 데이터베이스 생성</h4>
<p>데이터베이스 설정은 완료되었고, 이제 레일즈로 빈 데이터베이스를 만들 차례입니다. 다음의 rake 명령어로 수행할수 있습니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rake db:create
</pre>
</div>
</notextile>
<p>이 명령어는 여러분의 개발(development)와 테스트를 위한 SQLite3 데이터베이스를 <tt>db</tt> 폴더에 만들 것입니다.</p>
<div class='info'><p>Rake는 레일즈가 여러 목적으로 사용하는 범용 명령 실행 도구 입니다. <tt>rake -T</tt> 명령어로 실행할 수 있는 rake 명령어를 확인할 수 있습니다.</p></div>
<h3 id="Hello-Rails">4 Hello, Rails!</h3>
<p>새로운 언어를 시작하는 전통적인 방법의 하나로 화면에 빨리 텍스트를 띄워보는 것이죠. 이를 위해서는 레일즈 어플리케이션 서버를 실행시켜야합니다.</p>
<h4 id="Starting-up-the-Web-Server">4.1 웹서버 시작하기</h4>
<p>위의 가정을 통해서 이미 레일즈 어플리케이션을 가지고 있습니다. 이를 보려면 개발 환경에서 웹서버 시작이 필요합니다. 다음의 명령어로 실행할 수 있습니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rails server
</pre>
</div>
</notextile>
<p>기본적으로 WEBrick 웹서버 인스턴스를 실행합니다. (레일즈는 다른 웹서버를 사용할 수도 있습니다.) 어플리케이션의 동작을 확인하려면 브라우저를 실행해서 <a href="http://localhost:3000">http://localhost:3000</a> 에 접속해보세요. 레일즈의 기본 정보 페이지를 볼 수 있습니다.</p>
<p><img src="images/rails_welcome.png" title="Welcome Aboard screenshot" alt="Welcome Aboard screenshot" /></p>
<div class='info'><p>웹서버를 멈추기 위해서, Ctrl+C 를 실행중인 터미널 윈도우에서 누르세요. development(개발) 모드라면, 보통은 서버를 중단시킬 필요는 없습니다.; 변경된 파일을 서버가 자동으로 반영하기 때문이죠.</p></div>
<p>“Welcome Aboard” 페이지는 새로운 레일즈 어플리케이션을 위한 <em>스모크 테스트</em>입니다.: 이는 소프트웨어의 설정이 정확히 되어있는 확인하는데 사용됩니다. <em>About your application’s environment</em> 링크를 클릭해서 어플리케이션의 환경 값들을 요약한 내용을 확인할 수 있습니다.</p>
<h4 id="Say-Hello-Rails">4.2 “Hello”, Rails 라고 말하기</h4>
<p>레일즈가 "Hello"라고 말하게 하려면, 최소한 컨트롤러와 뷰정도는 만들어야 합니다. 다행스럽게도, 명령어 한줄이면 충분합니다. 다음의 명령어를 터미널에서 입력하세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rails generate controller home index
</pre>
</div>
</notextile>
<div class='info'><p>윈도우즈나 루비가 비표준의 방법으로 설치되어 있다면, 아마도 레일즈의 <tt>rails</tt> 커멘드에 대한 정확한 패스 정보를 루비에게 넘겨야 합니다. :<tt>ruby \path\to\your\application\script\rails generate controller home index</tt>.</p></div>
<p>레일즈는 <tt>app/views/home/index.html.erb</tt> 포함해서 몇가지 파일을 만들겁니다. 아 파일은 <tt>home</tt> 컨트롤러의 <tt>index</tt> 액션(메소드)를 위한 템플릿으로 이용됩니다. 이 파일을 텍스트 에디터로 열어서 이 한줄을 포함하도록 수정해 주세요.</p>
<p><code class="html">
<h1>Hello, Rails!</h1>
</code></p>
<h4 class="Setting-the-Application-Home-Page">어플리케이션 홈페이지 설정</h4>
<p>컨트롤러와 뷰를 만들었습니다. “Hello Rails”를 보기위해 레일즈에게 요청을 할 차례 입니다. 이번 경우에는 root <span class="caps">URL</span> 에다가 “Welcome Aboard” 스모트 테스트 데신에 <a href="http://localhost:3000">http://localhost:3000</a> 에서 나타나게 해보죠.</p>
<p>첫 단계는 기본 페이지를 어플리케이션에서 삭제하는 겁니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rm public/index.html
</pre>
</div>
</notextile>
<p>레일즈는 컨트롤러가 생성하는 동적인 내용들보다, <tt>public</tt> 디렉토리내의 정적인 파일을 보여주는 것을 우선시합니다. 그래서 이 파일을 삭제해야하죠.</p>
<p>이제, 홈페이지의 위치를 레일즈에게 알려주어야 합니다. <tt>config/routes.rb</tt> 를 에디터로 여세요. 이 파일은 외부 요청과 컨트롤러와 액션을 연결하는 방법이 기술된 어플리케이션의 <em>라우팅 파일</em> 입니다. 특별한 <acronym title="domain-specifiic language"><span class="caps">DSL</span></acronym>로 작성되어 있죠. 파일에는 많은 예제 라우팅 명령어들을 포함합니다. 그리고 이들 중에 하나는 root와 정해진 컨트롤러와 액션을 연결하는 예제도 있습니다. <tt>root :to</tt> 를 포함한 줄을 찾아서 주석을 해제하고 다음과 같이 변경하세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
Blog::Application.routes.draw do
#...
# You can have the root of your site routed with "root"
# just remember to delete public/index.html.
root :to => "home#index"
</pre>
</div>
</notextile>
<p><tt>root :to => "home#index"</tt> 이 명령어는 레일즈에게 root 액션을 home 컨트롤러의 index 액션과 연결하는 것을 의미합니다.</p>
<p>이제 <a href="http://localhost:3000">http://localhost:3000</a> 에 브라우저로 접속하면, <tt>Hello, Rails!</tt> 를 볼수 있습니다.</p>
<div class='note'><p>라우팅에 관한 더 많은 정보는 <a href="routing.html">외부 요청에 대한 레일즈 라우팅</a> 을 참고하세요.</p></div>
<h3 id="Getting-Up-and-Running-Quickly-with-Scaffolding">5 발판(Scaffolding)을 이용해서 빠르게 시작하기</h3>
<p>레일즈 <em>발판(scaffolding)</em>은 어플리케이션의 주요 요소를 빠르게 만드는 방법입니다. 새로운 리소스를 위해 모델, 뷰, 컨트롤러를 만들기 원하면, 발판(scaffolding)은 적합합니다.</p>
<h3 id="Creating-a-Resource">6 리소스 만들기</h3>
<p>블로그(blog) 어플리케이션의 사례에서 여러분은 발판(Scaffolding)을 이용해서 Post 리소스를 만들수 있습니다. (이 Post 리소스는 블로그에서 하나의 글을 표현합니다.) 이 작업을 위하여 터미널에서 다음을 입력하세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rails generate scaffold Post name:string title:string content:text
</pre>
</div>
</notextile>
<div class='note'><p>발판(scaffolding)을 수행하는 작업은 빠르게 진행됩니다. 이 과정에서 생성된 코드는 여러분의 어플리케이션에 완벽하게 적합하지 않을수 있습니다. 대부분의 경우에 생성된 코드를 적절하게 수정하는 작업이 필요합니다. 많은 숙련된 레일즈 개발자들은 발판(scaffolding) 기능을 통해 모든 코드를 생성하거나, 반대로 모든 소스 코드를 손수 만드는 것을 피합니다. 레일즈에서 모델, 컨트롤러, 뷰와 다른 소스 파일들을 적절하게 수정하기가 정말 단순하거든요. 좀 더 자세한 내용은 <a href="generators.html">레일즈 제너레이터(Generator) 제작과 수정</a> 을 참고하세요.</p></div>
<p>발판(Scaffold) 제너레이터는 어플리케이션내의 각 디렉토리에 15개의 파일을 생성합니다. 여기에 생성된 파일들에 대한 간단한 설명이 있습니다.:</p>
<table>
<tr>
<th>파일 </th>
<th>목적</th>
</tr>
<tr>
<td>db/migrate/20100207214725_create_posts.rb </td>
<td>데이터베이스에 ‘posts’ 테이블 생성하는 마이그레이션 (여러분의 파일 이름은, 다른 타임 스템프 값을 가지고 있습니다.)</td>
</tr>
<tr>
<td>app/models/post.rb </td>
<td>Post 모델</td>
</tr>
<tr>
<td>test/fixtures/posts.yml </td>
<td>테스트를 위한 더미(Dummy) posts</td>
</tr>
<tr>
<td>app/controllers/posts_controller.rb </td>
<td>Posts 컨트롤러</td>
</tr>
<tr>
<td>app/views/posts/index.html.erb </td>
<td>모든 posts 를 출력하는 index 뷰</td>
</tr>
<tr>
<td>app/views/posts/edit.html.erb </td>
<td>존재하는 post 를 수정하는 edit 뷰</td>
</tr>
<tr>
<td>app/views/posts/show.html.erb </td>
<td>단일 post를 보여주는 show 뷰</td>
</tr>
<tr>
<td>app/views/posts/new.html.erb </td>
<td>새로운 post 를 만들기 위한 new 뷰</td>
</tr>
<tr>
<td>app/views/posts/_form.html.erb </td>
<td>post 를 수정하거나 새로 만드는데 사용되는 폼(form)을 저장하는 조각(partial) 파일</td>
</tr>
<tr>
<td>app/helpers/posts_helper.rb </td>
<td>post 뷰를 위한 헬퍼(Helper) 함수를 위한 파일</td>
</tr>
<tr>
<td>test/unit/post_test.rb </td>
<td>posts 모델을 위한 유닛 테스트 파일</td>
</tr>
<tr>
<td>test/functional/posts_controller_test.rb </td>
<td>posts 컨트롤러를 위한 기능 테스트 파일</td>
</tr>
<tr>
<td>test/unit/helpers/posts_helper_test.rb </td>
<td>posts 헬퍼(Helper)를 위한 유닛 테스트 파일</td>
</tr>
<tr>
<td>config/routes.rb </td>
<td>posts 를 위한 라우팅 정보를 담은 수정된 라우팅 파일</td>
</tr>
<tr>
<td>public/stylesheets/scaffold.css </td>
<td>발판(Scaffold) 뷰를 좀 더 미려하게 만드는 <span class="caps">CSS</span> 파일 </td>
</tr>
</table>
<h4 id="Running-a-Migration">6.1 마이그레이션 실행하기</h4>
<p><tt>rails generate scaffold</tt> 명령이 생성하는 결과물로 <em>데이터베이스 마이그레이션</em>이 있습니다. 마이그레이션은 데이터베이스 테이블을 간단하게 생성하고 수정할 수 있도록 설계된 루비 클래스 입니다. 레일즈는 rake 명령을 이용해서 마이그레이션을 실행합니다. 데이터베이스의 적용한 뒤에 취소(undo) 마이그레이션을 만드는 것도 가능하죠. 마이그레이션 파일들은 생성될 시점의 타임 스템프 값을 가집니다.</p>
<p><tt>db/migrate/20100207214725_create_posts.rb</tt> 파일을 살펴보면(기억하세요, 파일 이름은 약간 다릅니다.), 다음과 같은 내용을 발견할 수 있습니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class CreatePosts < ActiveRecord::Migration
def self.up
create_table :posts do |t|
t.string :name
t.string :title
t.text :content
t.timestamps
end
end
def self.down
drop_table :posts
end
end
</pre>
</div>
</notextile>
<p>위의 마이그레이션 파일은 마이그레이션 작업을 수행하는 <tt>up</tt>과 나중에 적용된 마이그레이션을 되돌리는 <tt>down</tt>이렇게 두가지의 메소드를 가집니다. 이 경우에 <tt>up</tt> 명령은 두개의 문자열(string) 컬럼과 하나의 텍스트(text) 컬럼을 가지는 <tt>posts</tt> 테이블을 생성합니다. 이 테이블은 생성(creation)과 업데이트(updating) 시점을 기록하는 두개의 타임스템프(timestamp) 컬럼도 가집니다. 마이그레이션에 대한 더 자세한 설명은 <a href="migrations.html">레일즈 데이터베이스 마이그레이션</a> 문서를 참고하세요.</p>
<p>이 시점에서 다음의 rake 명령을 통해서 마이그레이션을 실행할 수 있습니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rake db:migrate
</pre>
</div>
</notextile>
<p>레일즈는 이 마이그레이션 명령을 실행하고 posts 테이블 생성을 보여줍니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
== CreatePosts: migrating ====================================================
-- create_table(:posts)
-> 0.0019s
== CreatePosts: migrated (0.0020s) ===========================================
</pre>
</div>
</notextile>
<div class='note'><p>기본적으로 여러분은 개발(development) 환경에서 작업하기 때문에, 이 명령어는 <tt>config/database.yml</tt> 파일내의 <tt>development</tt> 부분에 있는 데이터베이스에 적용됩니다. 다른 환경, 예를 들면 제품(production) 환경에 적용하려면 반드시 환경 변수 값을 명시적으로 넘겨주어야 합니다.: <tt>rake db:migrate RAILS_ENV=production</tt>.</p></div>
<h4 id="Adding-a-Link">6.2 링크 추가</h4>
<p>생성된 홈페이지에 posts 쓰기를 추가하려면, 링크를 추가해야 합니다. <tt>app/views/home/index.html.erb</tt> 을 열고 다음과 같이 수정하세요.</p>
<p><code lang="ruby">
<h1>Hello, Rails!</h1>
<%= link_to "My Blog", posts_path %>
</code></p>
<p><tt>link_to</tt>는 레일즈의 뷰 헬퍼로 내장된 메소드 입니다. 이 메소드는 텍스트를 기반으로한 링크를 생성합니다. – 이 경우에는 posts 의 경로 입니다.</p>
<h4 id="Working-with-Posts-in-the-Browser">6.3 브라우저에서 Posts 작업</h4>
<p>이제 posts 작업을 할 준비가 되었습니다. 이를 위해서 <a href="http://localhost:3000">http://localhost:3000</a> 로 이동한 후에 “My Blog” 링크를 클릭하세요.:</p>
<p><img src="images/posts_index.png" title="Posts Index screenshot" alt="Posts Index screenshot" /></p>
<p>레일즈는 여러분의 posts를 위한 <tt>index</tt> 뷰를 보여줄 겁니다. 현재는 데이터베이스에는 posts 가 저장되어 있지 않지만, <tt>New Post</tt>를 클릭하고 하나 만들수 있습니다. 그후에 수정하거나, 자세한 내용을 조회하거나, 삭제할 수 있는 posts(글)을 볼 수 있습니다. 모든 로직과 HTML은 단지 <tt>rails generate scaffold</tt> 명령어 한줄로 생성됩니다.</p>
<div class='info'><p>기본 환경인, 개발(development) 모드에서 레일즈는 브라우저의 매 요청마다 여러분의 어플리케이션을 갱신합니다. 그래서 웹서버를 중지시키거나 재시작할 필요가 없습니다.</p></div>
<p>축하합니다, 레일즈에 탑승하셨어요! 이제 모든게 어떻게 돌아가는지 알아볼 시간이네요.</p>
<h4 id="The-Model">6.4 모델</h4>
<p>모델 파일인 <tt>app/models/post.rb</tt> 는 다음과 같이 매우 단순합니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Post < ActiveRecord::Base
end
</pre>
</div>
</notextile>
<p>이 파일에는 별 내용이 없습니다. – 그러나 <tt>Post</tt> 클레스는 <tt>ActiveRecord::Base</tt>를 상속합니다. 액티브 레코드(Active Record)는 레일즈 모델을 자유롭게 다루는데 훌륭한 기능을 제공합니다. 기본 데이터베이스 <acronym title="생성(Create"><span class="caps">CRUD</span></acronym>, 읽기(Read), 갱신(Update), 삭제(Destroy) 기능, 데이터 검증, 복잡한 검색과 복합적인 모델 관계 지원 이런 것들을 포함합니다.</p>
<h4 id="Adding-Some-Validataion">6.5 몇 가지 데이터 검증(Validation) 추가하기</h4>
<p>레일즈는 데이터를 저장할때 데이터가 적합한지 확인하는 데이터 검증 메소드를 가지고 있습니다. <tt>app/models/post.rb</tt> 파일을 열어서 다음과 같이 수정하세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Post < ActiveRecord::Base
validates :name, :presence => true
validates :title, :presence => true,
:length => { :minimum => 5 }
end
</pre>
</div>
</notextile>
<p>이 수정 사항은 모든 글(post)은 이름(name)과 제목(title)을 가지고 있어야하고, 제목(title)은 최소 5글자 이상이라는걸 보장(확인)합니다. 레일즈는 모델에 대해서 다양한 조건의 데이터 검증을 할수 있습니다. 컬럼의 값의 존재여부, 유일성, 포맷, 그리고 관계된 객체의 존재 여부 검사 같은 것을 포함합니다.</p>
<h4 id="Using-the-Console">6.6 콘솔 사용하기</h4>
<p>액션에서 데이터 검증을 확인해보려면, 콘솔을 사용할 수 있습니다. 콘솔은 여러분의 어플리케이션 컨텍스트에서 루비 코드를 실행시킬 수 있는 커멘드-라인 도구입니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rails console
</pre>
</div>
</notextile>
<p>콘솔을 구동 시킨후에, 다음과 같이 어플리케이션의 모델을 수행할 수 있습니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
>> p = Post.new(:content => "A new post")
=> #<Post id: nil, name: nil, title: nil,
content: "A new post", created_at: nil,
updated_at: nil>
>> p.save
=> false
>> p.errors
=> #<OrderedHash { :title=>["can't be blank",
"is too short (minimum is 5 characters)"],
:name=>["can't be blank"] }>
</pre>
</div>
</notextile>
<p>이 코드는 새로운 <tt>Post</tt> 인스턴스를 생성하고, 저장을 시도하는 과정에서 <tt>false</tt>가 반환되는걸 보여줍니다. (이는 저장이 실패한 것을 의미합니다.) 그리고 글(post)의 <tt>errors</tt>를 검사(inspecting)하는 코드입니다.</p>
<p>할일을 모두 마쳤으면, <tt>exit</tt>를 치고 <tt>return</tt>키를 눌러서 콘솔을 빠져나오세요.</p>
<div class='info'><p>개발 웹서버와 다르게, 콘솔에서는 각 라인마다 자원을 다시 읽어들이지는 않습니다. 콘솔을 열어둔 상태에서 코드를 변경하였으면 이를 콘솔의 환경에 반영하기 위해서 <tt>reload!</tt> 입력하세요.</p></div>
<h4 id="Listing-All-Posts">6.7 모든 글(Posts) 목록 보기</h4>
<p>기능 확인하기 가장 쉬운 곳은, 모든 글(posts)의 목록을 출력하는 부분입니다. <tt>app/controllers/posts_controller.rb</tt> 파일을 열고 <tt>index</tt> 액션을 보세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @posts }
end
end
</pre>
</div>
</notextile>
<p><tt>Post.all</tt>은 현재 데이터베이스에 있는 모든 글(posts) 정보를 <tt>Post</tt> 모델로 반환하는 메소드 입니다. 이 호출의 결과는 글(post)의 배열이고 <tt>@posts</tt> 변수에 저장됩니다.</p>
<div class='info'><p>액티브 레코드(Active Record)에 관한 더 자세한 정보는 <a href="active_record_querying.html">액티브 레코드 쿼리 인터페이스</a> 글을 참고하세요.</p></div>
<p><tt>respond_to</tt> 블록은 이 액션에 대한 HTML과 <span class="caps">XML</span> 양쪽 모두 취급합니다. 브라우저에게 <a href="http://localhost:3000/posts.xml">http://localhost:3000/posts.xml</a> 요청하게 하면, <span class="caps">XML</span> 포멧의 글 목록(posts)을 확인할 수 있습니다. 액션 이름에 연결되는 <span class="caps">HTML</span> 포멧은 <tt>app/views/posts/</tt> 폴더 안에서 찾을 수 있습니다. 레일즈는 액션에서 사용되는 모든 인스턴스 변수를 뷰안에서 사용할 수 있게 구성되어 있습니다. <tt>app/views/posts/index.html.erb</tt> 내용 입니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; html-script: true; gutter: false; toolbar: false">
<h1>Listing posts</h1>
<table>
<tr>
<th>Name</th>
<th>Title</th>
<th>Content</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @posts.each do |post| %>
<tr>
<td><%= post.name %></td>
<td><%= post.title %></td>
<td><%= post.content %></td>
<td><%= link_to 'Show', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<td><%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New post', new_post_path %>
</pre>
</div>
</notextile>
<p>이 뷰는 <tt>@posts</tt> 배열을 순환하면서 내용과 링크를 보여줍니다. 뷰 안에 몇 가지 요소에 대한 설명입니다.:</p>
<ul>
<li><tt>link_to</tt>는 세부 항목에 대한 링크를 만듭니다.</li>
<li><tt>edit_post_path</tt> 와 <tt>new_post_path</tt> 는 레일즈가 제공하는 RESTfule 라우팅 부분입니다. 이 헬퍼들의 다양한 모습을 컨트롤러가 포함한 다른 액션들에서 볼 수 있습니다.</li>
</ul>
<div class='note'><p>이번 버전의 레일즈에서는, 반드시 <tt><%=h post.name %></tt> 사용해서 페이지에 출력할때 HTML에 적합하도록 변환(escape)해야 했습니다. 레일즈 3.0에서 이것은 기본 값입니다. 만약 변환을 원하지 않는다면 (unescape) <tt><%= raw post.name %></tt> 이렇게 사용해 주세요.</p></div>
<div class='info'><p>랜더링 과정에 관한 더 자세한 내용은 <a href="layouts_and_rendering.html" title="Rendering">레이아웃(Layouts)과 렌더링</a> 을 참고하세요.</p></div>
<h4 id="Customizing-the-Layout">6.8 레이아웃 수정하기(Customizing)</h4>
<p>뷰는 오직 웹 브라우저에 HTML을 보여주기 위한 부분입니다. 레일즈는 뷰를 포함하는 <tt>레이아웃(layouts)</tt>라는 개념을 가지고 있습니다. 레일즈가 브라우저에 뷰를 보여줄때, 뷰의 HTML을 레이아웃의 HTML에 집어 넣습니다. 이전 버전의 레일즈에서는 <tt>rails generate scaffold</tt>
명령어는 posts 컨트롤러에 대한 <tt>app/views/layouts/posts.html.erb</tt> 같이, 컨트롤러마다 레이아웃(layout) HTML을 생성했습니다. 그러나 레일즈 3.0에서는 어플리케이션 전체에 사용되는 <tt>레이아웃(layout)</tt>을 모든 컨트롤러에 사용하고, <tt>app/views/layouts/application.html.erb</tt> 파일에서 확인할 수 있습니다. 에디터로 이 레이아웃을 열어서 <tt>body</tt> 테그를 수정해 보세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; html-script: true; gutter: false; toolbar: false">
<!DOCTYPE html>
<html>
<head>
<title>Blog</title>
<%= stylesheet_link_tag :all %>
<%= javascript_include_tag :defaults %>
<%= csrf_meta_tags %>
</head>
<body style="background: #EEEEEE;">
<%= yield %>
</body>
</html>
</pre>
</div>
</notextile>
<p>이제 <tt>/posts</tt> 페이지를 갱신하면, 페이지의 배경색이 회색인걸 볼 수 있습니다. 이와 동일한 회색 배경색이 posts를 위한 모든 뷰에 사용됩니다.</p>
<h4 id="Creating-New-Posts">6.9 새 포스트 만들기</h4>
<p>새로운 포스트 만들기는 두개의 액션과 관련있습니다. 첫번째는 빈 <tt>Post</tt> 객체를 이용하는 <tt>new</tt> 액션입니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
def new
@post = Post.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @post }
end
end
</pre>
</div>
</notextile>
<p><tt>new.html.erb</tt> 뷰는 이 비어있는 Post를 사용자에게 보여줍니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; html-script: true; gutter: false; toolbar: false">
<h1>New post</h1>
<%= render 'form' %>
<%= link_to 'Back', posts_path %>
</pre>
</div>
</notextile>
<p><tt><%= render 'form' %></tt> 줄은 레일즈의 <em>partials</em> 를 처음 소개하는 거네요. 조각(partial)은 HTML과 루비 코드의 조각으로 여러 장소에서 재사용할 수 있습니다. 이 경우에는 새로운 글(post)를 만드는 폼이 글(post)를 수정하는 폼과 동일합니다. 양쪽 모두 이름(name)과 제목(title)을 위한 텍스트 필드(text field)와 본문(content)를 위한 텍스트 영역(text area)을 가지고 새로운 글(post)을 만들거나 존재하는 글을 수정합니다.</p>
<p><tt>views/posts/_form.html.erb</tt> 파일을 보면 다음과 같습니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; html-script: true; gutter: false; toolbar: false">
<%= form_for(@post) do |f| %>
<% if @post.errors.any? %>
<div id="errorExplanation">
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :content %><br />
<%= f.text_area :content %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
</pre>
</div>
</notextile>
<p>이 조각(partial)은 뷰 파일이 호출될때 정의된 모든 인스턴스 변수를 받습니다. 그래서 이 경우에 컨트롤러는 새로운 Post 객체를 <tt>@post</tt>에 할당했기 때문에 뷰와 조각(partial)은 모두 <tt>@post</tt>을 사용할 수 있습니다.</p>
<p>조각(partial)에 대한 더많은 정보를 원하시면 <a href=":layouts_and_rendering.html#using-partials" title="Rendering">레이아웃(Layouts)과 렌더링</a> guide 를 참고하세요.</p>
<p><tt>form_for</tt> 블록은 <span class="caps">HTML</span> 폼을 만드는데 사용됩니다. 이 블럭 안에서 폼에 대한 다양한 컨트롤을 만든는 메소드를 사용할 수 있습니다. 예를들어서 <tt>f.text_field :name</tt>은 레일즈에게 폼 위에 텍스트 인풋(text input) 만들고, <tt>name</tt> 속성(attribute)을 다루게 만듭니다. 오직 이 폼 메소드(<tt>form_for</tt>)와 관련된 모델이 가지고 있는 속성(attribute)값으로만 이러한 메소드를 사용할 수 있습니다. (이 경우에는 <tt>name</tt>과 <tt>title</tt> 그리고 <tt>content</tt> 속성만 사용할 수 있네요.) 코드가 좀 더 간결해지고, 특정한 모델 인스턴스와 폼이 명확하게 연결되기 때문에, 레일즈에서는 <tt>form_for</tt>를 여러분이 작성한 <span class="caps">HTML</span> 코드내에 사용하는걸 권장합니다.</p>
<p>또한 <tt>form_for</tt> 블록은 <em>새글(New Post)</em> 이나 <em>글수정(Edit Post)</em> 액션을 수행할때, 출력될 HTML에 폼의 <tt>action</tt> 태그와 submit 버튼의 이름을 채워넣을 만큼 충분히 영리합니다.</p>
<div class='info'><p>모델과 묶여있지 않는, 임의의 필드를 출력하는 <span class="caps">HTML</span> 폼을 만들때, 모델 인스턴스와 관계없는 폼을 만드는 기능을 가진 <tt>form_tag</tt> 메소드를 사용하세요.</p></div>
<p>사용자가 <tt>Create Post</tt>버튼을 폼에서 클릭하면, 브라우저는 컨트롤러의 <tt>create</tt>에 정보를 보낼 것 입니다. (레일즈는 HTTP의 <span class="caps">POST</span> 요청을 통해서 <tt>create</tt> 메소드를 불러야 한다는걸 알 수 있습니다.; 이것은 위에 언급된 레일즈의 관습 중에 하나입니다.)</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
def create
@post = Post.new(params[:post])
respond_to do |format|
if @post.save
format.html { redirect_to(@post,
:notice => 'Post was successfully created.') }
format.xml { render :xml => @post,
:status => :created, :location => @post }
else
format.html { render :action => "new" }
format.xml { render :xml => @post.errors,
:status => :unprocessable_entity }
end
end
end
</pre>
</div>
</notextile>
<p><tt>create</tt> 액션은 폼에서 사용자가 제공한 정보로부터 레일즈가 만들어낸 <tt>param</tt> 해쉬를 기반해서, 새로운 Post 객체를 생성합니다. 새로운 글(post)가 성공적으로 저장된 이후에, <tt>create</tt>는 사용자 요청에 적합한 포멧을 반환합니다. 이 경우에 사용자는 <tt>show</tt> 액션으로 리다이렉트되어서 글(Post)이 성공적으로 작성된 것을 확인할 수 있습니다.</p>
<p>글의 저장이 성공하지 못하면, 데이터 검증 관련 에러를 발생하고 컨트롤러는 <tt>new</tt> 액션으로 사용자를 안내한 후에 에러 메세지를 출력해서 사용자에게 옳바르게 에러를 수정할 기회를 제공합니다.</p>
<p>“Post was successfully created.”라는 메세지가 레일즈의 <tt>flash</tt> 해쉬에 저장된 후, (일반적으로 그냥 <em>the flash</em>라고 부릅니다.) 이 성공 메세지는 다른 액션에도 전달될수 있어서 사용자에게 진행 된 요청의 상태 정보를 제공합니다. <tt>create</tt> 경우에, 사용자는 Post(글)이 생성 중에는 볼수잇는 페이지가 없습니다. 왜냐하면 새로운 글(Post)가 저장된 후에는 곧바로 만들어진 글을 보여주는 페이지로 이동하기 때문이죠. Flash는 다음 액션에도 메세지를 보관하고 있습니다. 그래서, 사용자가 <tt>show</tt> 액션으로 리다이렉트 되어도 “Post was successfully created.”를 확인할 수 있게되죠.</p>
<h4 id="Showing-an-Individual-Post">6.10 각각의 글 보여주기</h4>
<p>인덱스 페이지에서 글(post) 하나를 위한 <tt>show</tt> 링크 클릭하면, 레일즈는 <tt>http://localhost:3000/posts/1</tt> 모양의 URL로 안내합니다. 레일즈는 이걸 해석해서 해당 리소스를 위한 <tt>show</tt> 액션을 호출하고, 파라미터의 <tt>id</tt> 에 <tt>1</tt> 담아서 넘깁니다. 여기 <tt>show</tt> 액션을 보세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
def show
@post = Post.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @post }
end
end
</pre>
</div>
</notextile>
<p><tt>show</tt> 액션은 id 값을 이용해서 데이터베이스에 있는 글(Post) 하나에 해당하는 레코드를 <tt>Post.find</tt>를 이용해서 찾습니다. 레코드를 찾은 후에, 레일즈는 <tt>show.html.erb</tt> 를 이용해서 화면에 출력합니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; html-script: true; gutter: false; toolbar: false">
<p class="notice"><%= notice %></p>
<p>
<b>Name:</b>
<%= @post.name %>
</p>
<p>
<b>Title:</b>
<%= @post.title %>
</p>
<p>
<b>Content:</b>
<%= @post.content %>
</p>
<%= link_to 'Edit', edit_post_path(@post) %> |
<%= link_to 'Back', posts_path %>
</pre>
</div>
</notextile>
<h4 class="Editing-Posts">글 수정하기</h4>
<p>새로운 글을 만드는 것과 비슷하게, 글을 수정하는건 두가지 과정으로 이루어집니다. 첫번째는 원하는 글에 <tt>edit_post_path(@post)</tt> 요청하는 것입니다. 이 요청은 컨트롤러에서 <tt>edit</tt> 액션을 호출합니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
def edit
@post = Post.find(params[:id])
end
</pre>
</div>
</notextile>
<p>글을 요청한 후에, 레일즈는 <tt>edit.html.erb</tt> 뷰를 이용해서 이를 출력합니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; html-script: true; gutter: false; toolbar: false">
<h1>Editing post</h1>
<%= render 'form' %>
<%= link_to 'Show', @post %> |
<%= link_to 'Back', posts_path %>
</pre>
</div>
</notextile>
<p><tt>new</tt> 액션처럼, <tt>form</tt> partial 을 사용합니다. 하지만 이번에 폼은 PostController 에게 <span class="caps">PUT</span> 액션을 요청하고, submit 버튼에는 “Update Post”라고 표시 됩니다.</p>
<p>위의 폼에서 이루어진 요청은, 컨트롤러의 <tt>update</tt> 액션을 호출합니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
def update
@post = Post.find(params[:id])
respond_to do |format|
if @post.update_attributes(params[:post])
format.html { redirect_to(@post,
:notice => 'Post was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @post.errors,
:status => :unprocessable_entity }
end
end
end
</pre>
</div>
</notextile>
<p><tt>update</tt> 액션에서, 레일즈는 처음에 수정 뷰가 넘긴 <tt>:id</tt> 파라미터를 이용해서 데이터베이스에 있는 목표 레코드 위치를 찾아 냅니다. 그 다음에 <tt>update_attributes</tt> 호출해서 요청(request)에서 받은 파라미터들을 해당 레코드에 적용합니다. 모든게 잘 이루어지면 해당 글(post)의 <tt>show</tt> 뷰로 리다이렉트 시킵니다. 만약, 문제가 발생하면, 이에 대한 수정을 위해서 <tt>edit</tt> 뷰로 되돌아 갑니다.</p>
<h4 id="Destroying-a-Post">6.11 글 지우기</h4>
<p><tt>destroy</tt> 링크는 <tt>destroy</tt> 액션으로 관련 id를 전송합니다.</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
def destroy
@post = Post.find(params[:id])
@post.destroy
respond_to do |format|
format.html { redirect_to(posts_url) }
format.xml { head :ok }
end
end
</pre>
</div>
</notextile>
<p>액티브 레코드 인스턴스의 <tt>destroy</tt> 메소드는 데이터베이스의 관련 레코드를 삭제합니다. 이 작업이 완료되면, 보여줄 정보가 존재하지 않아서, 레일즈는 사용자 브라우저를 모델을 위한 index 뷰로 리다이렉트 시킵니다.</p>
<h3 id="Adding-a-Second-Model">7 두번째 모델 추가하기</h3>
<p>발판(scaffolding) 작업으로 만들어진 이와 같은 모델들이 어떻게 동작하는지 알게되었습니다. 이제 어플리케이션에 두번째 모델을 추가할때죠. 두번째 모델은 블로그 글(blog post)의 댓글(comment)를 다루게 됩니다.</p>
<h4 id="Generating-a-Model">7.1 모델 만들기</h4>
<p>레일즈에서 모델은 단수형 이름을 사용합니다. 그리고 이들은 데이터베이스의 복수형으로 이름 붙여진 테이블과 상호 작용합니다. comments 와 관련있는 모델은 관습상 Comment 라는 이름을 사용합니다. 비록 여러분은 발판(scaffolding) 작업을 통해서 이런 구조 전체를 만드는걸 원하지 않을지도 모르겠어요. 그렇지만 대부분은 레일즈 개발자들은 아직 모델과 컨트롤러 같은 요소를 만드는데 제너레이터를 이용합니다. 새로운 모델을 만들기 위해서 다음의 명령어를 터미널에서 실행하세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: plain; gutter: false; toolbar: false">
$ rails generate model Comment commenter:string body:text post:references
</pre>
</div>
</notextile>
<p>이 명령어는 다음의 4개의 파일을 만듭니다.:</p>
<ul>
<li><tt>app/models/comment.rb</tt> – The model</li>
<li><tt>db/migrate/20100207235629_create_comments.rb</tt> – The migration</li>
<li><tt>test/unit/comment_test.rb</tt> and <tt>test/fixtures/comments.yml</tt> – The test harness.</li>
</ul>
<p>우선 <tt>comment.rb</tt> 를 보세요.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Comment < ActiveRecord::Base
belongs_to :post
end
</pre>
</div>
</notextile>
<p>이 파일은 이전에 보았던 <tt>post.rb</tt> 모델과 매우 비슷합니다. 다른 점은 <tt>belongs_to :post</tt> 가 존재하는 건데, 이건 액티브 레코드의 <em>관계(association)</em> 을 정의하는 규칙입니다. 이 가이드의 다음 색션에서 관계(association)에 대해서 조금 더 배우게 될 겁니다.</p>
<p>모델과 더불어, 레일즈는 이와 대응하는 데이터베이스 테이블 생성 마이그레이션도 만듭니다.:</p>
<notextile>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class CreateComments < ActiveRecord::Migration
def self.up
create_table :comments do |t|
t.string :commenter
t.text :body
t.references :post
t.timestamps
end
add_index :comments, :post_id
end