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 이다. (파일 이름은 생성 시간 등에 따라 약간 달라질 수 있다.)


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

"http://guides.rubyonrails.org/getting_started.htm"의 흐름은 따라가지만, 내가 테스트하면서 정리한 내용만 들어있음.


----------------------------------------------------------------------------

다음으로 가기전에... 위 웹 사이트에서 controller, action, view의 생성을 했는데 부족한 듯 하여 조금 보충 내용을 추가함. 다음 섹션에서 상세히 설명은 되겠지만...


controller, view에 대해서 짧게 역할을 테스트 해보자. 


텍스트 필드에 입력한 정보를 controller에서 받아 view로 보여주자.


일단 유저가 입력하는 페이지를 아래와 같이 만들고 viewtest.html라는 이름으로 명명하자. viewtest.html 파일은 어디에 위치해 있던 상관없다.


<html>

<head><title> controller / view test </title> </head>

<body>

<form action="http://localhost:3000/">

please input your name <br>

<input type="text" name="yr_name"> <br>

<input type="submit"><br>

</form>

</body>

</html>


기존에 만들었던 app/controllers/welcome_controller.rb를 아래와 같이 수정한다.


class WelcomeController < ApplicationController

  def index

@data_yr_name = params[:yr_name]

  end

end


기존에 만들었던 app/views/welcome/index.html.erb를 아래와 같이 수정한다.


<h1> Hello! <%=@data_yr_name %> </h1>


viewtest.html를 실행하여 이름을 입력 후 submit 버튼을 누르면 입력한 이름이 출력되는 것을 확인할 수 있다. 


위 샘플을 통해 view와 controller의 역할과 작동방법을 알아 보았다. 


----------------------------------------------------------------------------


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

지난번에 우연곡절 끝에 rails server를 정상적으로 가동하는데 성공했다. 


하지만 이후, 프로젝트를 만들 때 Gemfile은 항상 말썽이다. 


일단 이에 대한 상세원인은 다시 상세히 검토하여 다시 글을 올려둬야겠다.



일단 rails에서 DB를 다루어 API 서버를 만들어 보는게 목표이기에 코딩을 시작해 봐야지. 


그 시작은  "http://guides.rubyonrails.org/getting_started.html" 요기!! 공식 튜토리얼이니 찬찬히 보면서 시작해보자. 


아래는 "http://guides.rubyonrails.org/getting_started.html" 의 내용을 나름대로 정리한 내용이다.


rails --version 의 결과는 4.1.0 샘플과 같다.


blog라는 이름의 어플리케이션을 만들어 보자.


$rails new blog


cd blog로 들어가서 실행


$rails server

tzinfo에러는 여전히 발생. gemfile 파일을 수정하고 재실행하면 가동!


웹 브라우져에서 localhost:3000 으로 접속하면 "Welcome aboard" 화면 등장!


localhost:3000/blog 입력하면 아직 에러 화면 뜸. 이제 하나씩 만들어 보자.



튜토리얼 순서대로 "Hello!!"라고 말하는 레일즈를 만들어본다. 이를 위해서는 최소한 controller와 view가 필요하다.


controller의 역할은 어플리케이션으로부터 어떤 요청을 받는 것이다. Routing은 요청들을 어떤 controller가 받을지 결정한다. 종종, 하나의 controller에 하나 이상의 route가 존재하기도 하며, 각 route들은 서로 다른 action들을 제공하기도 한다. action의 목적은 view에서 보여줄 정보를 모으는 것이다.


view의 목적은 여러 정보를 우리가 읽을 수 있도록 만들어 출력하는 것이다. view는 단지 출력용이며, view 템플릿은 기본적으로 eRuby라는 언어로 작성되어진다.


이제 controller를 만들어보자.


$rails generate controller welcome index


"index"라고 불리는 action을 가진 "welcome"  controller를 생성한 것이다.


controller는 app/controller/welcom_controller.rb, view는 app/views/welcome/index.html.erb에 생성되었다.


"app/views/welcome/index.html.erb" 파일을 열어, 불필요한 것들을 지우고, 아래와 같이 바꿔보자.


<h1> 안뇽! rails~! </h1>


잘 나오는지 확인해보려고 localhost:3000/welcome/index 들어갔는데.. 헉!! 에러남. 알고보니 한글 인식 문제였음. 스크립트 파일이라 그런건가. 일단, 아래와 같이 일단 수정해서 정상 출력확인.


<h1> Hello! rails~! </h1>


이제 localhost:3000으로 입력했을 때 저 문장이 나오도록 해보자.


config/rubtes.rb 열어서 아래와 같이 수정해보라.


get 'welcome/index' 부분을 root 'welcome#index' 로 수정.


이제 localhost:3000으로 들어가면 변경된 내용을 확인할 수 있다.








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

'개발/경험' 카테고리의 다른 글

ruby on rails 시작해보기 - 2  (0) 2014.05.06
ruby on rails 시작해보기 - 1-1. 보충설명.  (0) 2014.05.04
ruby on rails 시작해보기 - 1  (0) 2014.05.03
ruby on rails 윈도우 설치  (0) 2014.04.20
Ruby on Rails  (0) 2014.04.16
SVN 속도 문제  (0) 2014.04.14
2009.08.27 13:25

라고 공감을 하나요? ^^

이곳에는 제 생각을 여과 없이 담아 보고 싶습니다. 다른 사람들 눈치 보지 않고, 맘 속에 있는 그것 그대로를 말입니다.

사실 이런 내용들이 남들과의 공감을 이끌기 위함이라기 보다는 제 머리 속의 것들을 정리하고 싶은 목적입니다.

그리고 조금은(^^) 다른 분들은 어떻게 생각하는지도 알고 싶습니다.

웹 개발에서 게임 개발이라는 분야로 넘어 온지 이제 10년이 되어가고 있습니다. 한 회사에서 제 청춘과 게임 개발에 대한 열정을 다했는데 이제 잠시 돌아볼 시점이 되지 않았나 싶네요. 주변은 어떻게 변했는지도 보고 싶고요.


그리고 앞으로도 즐겁고 매일매일이 행복한 게임 개발을 위한 하루가 되었으면 합니다.

여러분들도 그러시길 바라면서 ^^



신고

'주저리' 카테고리의 다른 글

바른 생활  (0) 2009.11.18
9월의 마지막 날  (0) 2009.09.30
코드를 공유한다는 것!  (0) 2009.09.29
일정을 잘 지키는 것  (0) 2009.08.28
미친거 아냐...  (0) 2009.08.27
컴퓨터 게임은 하이테크놀로지를 필요로 하는 엔터테이먼트이다.  (0) 2009.08.27
개요, 시작


티스토리 툴바