2014.05.06 09:57

"http://guides.rubyonrails.org/getting_started.html " 5 Getting Up andRunning 이하 내용.


흐름은 따라가지만, 내가 테스트하면서 정리한 내용만 들어있음.


------------------------------------------------------------------------------------
Blog 어플리케이션에 새로운 resource를 만들어보자. 여기서 resource는 글, 사람 혹은 동물같은 비슷한 객체들의 조합을 위해 사용되는 말이다.

Rails는 표준 REST resource를 정의된 resource 메소드를 제공한다. ('REST 인터페이스의 원칙에 대한 가이드'를 참고할 것!) 아래는 config/routes.rb에 'article' resource를 정의한 후의 모습이다.

Rails.application.routes.draw do
  resources :articles
  root 'welcome#index'
end

'rake routes'를 실행하면, 모든 표준 RESTful action들을 위해 정의된 routes를 볼 수 있다. 
prefix column의 의미는 나중에 보게 될텐데, 지금 알아두어야 할 사항은, Rails의 방향성은  단일 양식 article이며, 역할의 명확성을 추구하도록 만들어졌다.


다음 섹션에서는, 우리의 어플리케이션에 새로운 글을 생성하고 보는 기능을 추가할 것이다. 즉, CRUD의 C(Create)와 R(Read)의 기능이다. 입력 폼은 아래와 같다. 

The new article form

너무 기본적으로 보이긴 하지만, 일단은 이걸로 오케이!! 앞으로 우리는 이것으로 계속 발전시켜 잘 거니까. ^^

5.1 Laying down the ground work


이제 새로운 기사를 생성하는 어플리케이션을 만들어보자. 

기존에 생성한 어플리케이션에서 http://localhost:3000/articles/new를 입력해보면 에러가 발생한다. 

Routing Error
 uninitialized constant ArticlesController

이 에러는 route가 요청을 처리하는 controller가 정의되지 않아 발생하는 것인데, 생성만 해주면 간단히 해결된다. 아래 명령을 실행해보라.
 (이전 예제에 이어, blog 어플리케이션에서 생성하라.)
rails g controller articles 
app/controllers/articles_controller.rb를 볼 수 있다. 해당 내용은 이름만 명명되고, 실제 내용은 없는 상태다.

이제 좀 전에 열었던 페이지를 리플래쉬 해보면 아래와 같은 에러가 발생하는 것을 알 수 있다. 

Unknown action
  The action 'new' could not be found for ArticlesController

이 에러는 좀 전에 생성했던 AcriclesController에 액션이 없기 때문에 발생한다. 생성 시 별도 지정하지 않으면, 기본적으로는 빈 상태로 controller가 생성되기 때문이다.

controller안에 수동으로 생성해보자. app/controllers/articles_controller.rb를 열어 해당 클래스에 아래와 같이 새로운 method를 정의해보라.

def new
end

다시 갱신해보면 "Template is missing .. " 에러가 발생한다. 이유는 Rails는 이와 연동된 view가 없기 때문이다.

에러 메세지는 꽤 긴데, 이를 하나씩 살펴보자.

Missing template articles/new, application/new with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: * "C:/work/ruby/blog/app/views"


첫번째 부분에서는 찾지 못한 템플릿이 무엇인지 기록되어 있다. 여기서는 articles/new 템플릿이다. Rails는 이 템플릿을 처음으로 실행하려 하지만, 찾지 못할 경우, application/new 템플릿을 로드하려고 한다. 이는 ArticlesController가 ApplicationController를 상속받았기 때문이다.


다음 부분은 해쉬를 포함하고 있다. 이 해쉬의 ":locale"키는  템플릿이 작성된 언어가 무엇인지를 정의하고 있다. 기본적으로 영어를 사용하므로 "en"으로 정의된다. 다음 키인 ":formats"는 응답시 제공되는 템플릿의 형식을 정의한다. 기본은 html이며, 그래서 Rails는 html 템플릿을 찾는 것이다. 마지막 키인 ":handlers"는 우리의 템플릿을 실행하는 게 어떤 템플릿 핸들러들인지를 알려준다 ":erb"는 HTML 템플릿을 위한 가장 공통적으로 사용하는 것이다. ":builder"는 XML 템플릿을 위해 사용되며, ":coffee"는 Javascript템플릿을 빌드하는데 사용하는 "CoffeeScript"을 말한다. 


메세지의 마지막에는 Rails가 찾고 있는 위치가 어딘지를 알려준다. 예제에서는 하나의 위치만 있지만, 좀 더 복잡한 프로그램에서는 여러 다른 경로를 가지기도 한다.


"app/views/articles/new.html.erb"를 만들어보자. 파일의 확장자가 중요한데, 첫번째 확장자(html)는 템플릿의 포멧이며, 두번째 확장자(erb)는 사용될 핸들러를 정의한다. Rails는 이 프로그램을 위해 app/views에 있는 articles/new라고 불리는 템플릿을 찾아 실행한다. 템플릿의 포멧은 html만 가능하며, 핸들러는 erb, builder,coffee 중 하나여야 한다. 지금은 html form을 생성하기 원하는 것이니, erb를 사용해야 한다. 그러므로 이 파일은 articles/new.html.erb로 만들면되고, app/views 폴더 안에 위치해야 한다.


이제 파일을 해당 위치에 생성하고 아래 내용을 넣어보자.

<h1> New Article</h1>


http://localhost:3000/articles/new로 다시 가보면 위 내용을 정상적을 볼 수 있다. 이제 route, controller,action 그리고 view까지, 모두 조화롭게 작동하는 걸 보았다. 이제 새 글을 만들기 위한 폼을 만들어볼 시간이다. 


5.2  The first form


템플릿에 form을 생성할 때는 form builder를 사용하자. Rails의 우선적인 form builder는 form_for라는 이름으로 불리는 helper method에 의해 제공된다. 이 method를 사용하하려면, "app/views/articles/new.html.erb"에 아래 코드를 추가하라.

<%= form_for :article do |f| %>

  <p>

    <%= f.label :title %><br>

    <%= f.text_field :title %>

  </p>

 

  <p>

    <%= f.label :text %><br>

    <%= f.text_area :text %>

  </p>

 

  <p>

    <%= f.submit %>

  </p>

<% end %>

해당 페이지를 갱신하면 이제 원하는 폼을 볼 수 있다.


'form_for' 다음에 이 form을 위한 식별 객체를 정의한다. 이 예에서, :article이 된다. 이 method 의 block안에서 FormBuilder 객체 -여기서는 f다.- 는 두개의 label과 글을 작성하는데 사용하는 타이틀과 텍스트, 두개의 text field 를 빌드해서 사용한다. 마지막으로 f 객체를 최종 승인하는 submit 버튼을 생성하나다.

여기에 한가지 문제가 있다. 생성된 html 소스코드에서 소스보기를 하면, /articles/new라는, 폼을 위한 action 속성을 볼 수 있다. This is a problem because this route goes to the very page that you're on right at the moment(이런 문장 완전 싫어 ㅠ_ㅜ), and that route should only be used to display the form for a new article.


이 폼은 다른 어떤 곳으로 가라고 지시하기 하기 위해 다른 url을 사용할 필요가 있다. 이건 form_for의 :url 옵션을 통해 간단히 처리할 수 있다. 일반적으로 Rails에서, 새로운 폼을 처리하는데 사용되는 action을 "create"라고 부르며, 기본적으로 이 이름을 사용한다.


app/views/articles/new.html.erb를 아래처럼 수정해보자. 

<%= form_for :article, url: articles_path do |f| %>

이 예에서, articles_path helper는 :url 옵션에 전달된다. 이제 rake routes를 다시 실행해보면 아래와 같은 결과를 볼 수 있다. 

$ rake routes
      Prefix Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          articles#index
             POST   /articles(.:format)          articles#create
 new_article GET    /articles/new(.:format)      articles#new
edit_article GET    /articles/:id/edit(.:format) articles#edit
     article GET    /articles/:id(.:format)      articles#show
             PATCH  /articles/:id(.:format)      articles#update
             PUT    /articles/:id(.:format)      articles#update
             DELETE /articles/:id(.:format)      articles#destroy
        root GET    /                            welcome#index


이제 내용을 채운 후 submit 버튼을 누르면 아래와 같은 에러를 볼 수 있다. 

Unknown action create for ArticlesController

이 에러를 해결하기 위해서는 ArticlesController에 create action을 넣어야만 한다. 


5.3 Creating articles

새로운 액션을 위해, app/controllers/articles_controller.rb의 ArticlesController 클래스에 create action을 넣자.

class ArticlesController < ApplicationController

def new

end

def create

end

end

다시 내용을 채우고 submit을 눌러보면 "template is missing" 에러를 볼 수 있다. 별거 아님. 일단 무시할 수 있다. create action에서 database(이하 db)에 새로운 글을 저장할 수 있어야만 한다. 


form의 필드들은 파라미터로 Rails에 보내진다. 그 파라미터들은 일반적으로 특수한 작업에 필요한, controller action안에서 참조된다. 아래처럼 create action을 수정해보자. 

def create

render plain: params[:article].inspect

end

render method는 params[:article].inspect의 텍스트와 값의 키를 가진 hash를 간결하게 보여준다. params method는 form에서 보내온 파라미터를 반영하는 객체이다. params method는 ActiveSupport::HashWithIndifferentAccess 객체를 돌려주는데, 이건 스트링이나 심볼을 키로 hash에 접근할 수 있다. 


이제 다시 해보면, 에러 대신 아래 내용을 볼 수 있다.

{"title"=>"First article!", "text"=>"This is my first article."}


5.4  Creating the Article model

Rails에서 Models은 단수 이름을 쓰며, db tables의 이름은 복수 이름을 사용한다.Rails는 모델생성을 위한 생성자를 재공한다. 아래 커멘트를 실행해보라.

$ rails generate model Article title:string text:text
이 커멘트에는 우리가 Article model을 원하며, 스트링 타입의 title 속성, 그리고 텍스트 타입의 text 속성을 요청했다. 이 속성들은 articles table에 자동으로 추가되며 Article model에도 자동으로 매핑된다. 


Rails를 여러 파일들을 만드는데, 지금은 app/models/article.rb와 db/migrate/20140521122056_create_articles 이다. (파일 이름은 생성 시간 등에 따라 약간 달라질 수 있다.)


저작자 표시 비영리 동일 조건 변경 허락
신고