2014.06.07 08:44

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


5.x 부터는 튜토리얼을 그대로 따라가면서 진행 중 ^^a


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

5.5 Running a Migration


지금까지 본 것처럼, Rails는 Model을 db/migrate 디렉토리 안에 database migration 파일을 생성한다.  Migrations는 database 테이블들의 생성과 수정이 간단히 만들어지게 디자인된 Ruby 클래스다.  Rails 마이그레이션을 실행하는 rake 명령어를 사용한다. 그리고 이건 당신의 DB에 적용된 마이그레이션 한 결과를 되돌리는것이 가능하다. 마이그레이션 파일이름에는 날짜가 포함되어 있으며, 이를 통해 undo가 가능하다.


db/migrate/20140521122056_create_articles.rb 파일(파일명의 날짜는 당신이 생성한 날짜로 생성된다.)을 보면, 아래와 같은 내용을 볼 수 있다.


class CreateArticles < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.string :title
      t.text :text
 
      t.timestamps
    end
  end
end


rake 명령을 이용해서 migration을 실행하자.


$ rake db:migrate


Rails는 Articles 테이블을 생성해 줄거다.


기본적으로 우리는 개발환경에서 작업을 하기 때문에, 이 명령어는 config/database.yml의 개발섹션에 정의된 정보를 반영하여 생성한다. 만약 다른 환경에서 migration을 실행하길 원한다면, rake 명령을 실행할 때, 인자값을 확실히 전달해야 한다. : rake db:migrate RAILS_ENV=production


5.6 Saving data in the controller

ArticlesController으로 돌아가서, database에 정보를 저장하는 새로운 Article Model을 사용하기 위해 create action을 변경하는 작업이 필요하다. app/controllers/articles_controller.rb를 열고, 아래와 같은 내용으로 수정하자.


def create
  @article = Article.new(params[:article])
 
  @article.save
  redirect_to @article
end


Rails Model은 database 컬럼에 자동으로 매핑된 속성에 초기에 바로 적용되게 할 수 있다. 첫번째 라인이 바로 그것이다. 다음으로, @article.save는 db에 모델을 저장한다. 마지막으로, 유저에게 결과를 보여준다.


나중에 다시 볼 수 있는데, @article.save 는 정상적으로 저장되었는지, 혹은 실패했는지를 boolean값으로 돌려준다.


http://localhost:3000/articles/new 로 가보면 아래와 같은 에러를 보게된다.


ActiveModel::ForbiddenAttributesError in ArticlesController#create

ActiveModel::ForbiddenAttributesError

Extracted source (around line #6):

4 5 6 7 8 9

def create
@article = Article.new(params[:article])
@article.save
redirect_to @article


Rails는 안전한 어플을 만들 수 있도록 도와주는 여러가지 보안 기능을 제공한다. 우리는 title,text 파라미터만 허락하길 원하니 article_params를 아래와 같이 더해보자.


def create
  @article = Article.new(article_params)
 
  @article.save
  redirect_to @article
end
 
private
  def article_params
    params.require(:article).permit(:title, :text)
  end


이 action에서 사용된 permit은 title과 text 두개만 수락하도록 한다.


"def article_params"는 private이다.  이는 속성값으로 위장되어 모델에 전달되는 것을 방지할 수 있다. 더 많은 정보를 위해서는  the blog article about Strong Parameters 를 참고하라.


5.7 Showing Articles


이제 다시 새로운 글을 쓰고 submit 버턴을 눌러보자. Rails는 show action을 찾을 수 없다고 투덜거릴거다. 더 진행하기 전에 show action을 추가해보자.


rake routes 의 결과에서 본 것처럼, show action을 위한 그 route는 아래와 같다.


article GET    /articles/:id(.:format)      articles#show


app/controllers/articles_controller.rb에 show action을 추가해보자.


def show
  @article = Article.find(params[:id])
end


두가지를 주목해야 한다. 우리는 우리가 원하는 article을 찾기 위해 요청 정보에 포함된 :id 인자값을 가져오는 params[:id]를 Article.find에 전달하여 찾는다. 또한, article object를 참조하기 위해 @를 앞에 붙인 임시 변수를 사용하는데, Rails는 이 임시 변수들을 view에도 전달하기 때문에 이렇게 사용할 수 있다.


이제, 아래와 같이 app/views/articles/show.html 파일을 새로 만들자.


<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
 
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>


마침내 새로운 아티클을 생성할 수 있게 되었다. 이제  http://localhost:3000/articles/new 로 접속해서 다시 시도를 해보자. 


5.8 Listing all articles


우린 아직 우리의 모든 articles에 대한 리스트를 볼 수 있는 방법이 필요하다. 이제 이걸 해보자. rake route에서 아래 내용을 볼 수 있었다.


articles GET    /articles(.:format)          articles#index


app/controllers/articles_controller.rb 파일의 ArticlesController 안에 index action을 추가해보자.


def index
  @articles = Article.all
end


그리고 마지막으로, app/views/articles/index.html.erb에 이 액션에 view를 추가하자.


<h1>Listing articles</h1>
 
<table>
  <tr>
    <th>Title</th>
    <th>Text</th>
  </tr>
 
  <% @articles.each do |article| %>
    <tr>
      <td><%= article.title %></td>
      <td><%= article.text %></td>
    </tr>
  <% end %>
</table>


이제 http://localhost:3000/articles 로 가면, 지금까지 등록한 모든 글들의 리스트를 볼 수 있다.


5.9 Adding links


이제 글을 생성하고, 글을 보고, 리스트를 볼 수 있습니다. 이제, 페이지를 넘나드는 몇몇 링크를 추가해보자.


app/views/welcome/index.html/erb를 열고, 아래와 같이 수정하자.


<h1>Hello, Rails!</h1>
<%= link_to 'My Blog', controller: 'articles' %>

link_to method는 Rails의 built-in view helpers 중 하나이다. 이걸 사용하면 텍스트 기반의 하이퍼링크를 만들 수 있는데, 여기서는 article로 연결해주자.


<table> 태크 아래에, add/views/articles/index.html.erb "새글쓰기"링크를 추가해보자. 


<%= link_to 'New article', new_article_path %>


app/views/articles/new.html/erb에 index action으로 돌아가는 링크를 넣어보자.


<%= form_for :article, url: articles_path do |f| %>
  ...
<% end %>
 
<%= link_to 'Back', articles_path %>


마지막으로, app/views/articles/show.html.erb에도 index action으로 돌아가는 링크를 추가하자. 그렇게하면 글을 보던 사람이 전체 리스트 보기로 돌아갈 수 있다.

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
 
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>
 
<%= link_to 'Back', articles_path %>


만약 같은 컨트롤 안의 액션으로 링크할 때는, :controller 옵션을 명시할 필요는 없다. 레일즈는 기본적으로 현재의 컨트롤을 사용하기 때문이다.


개발모드에서는 매 요청마다 어플리케이션을 리로드하기 때문에, 서버를 재시작할 필요는 없다. 



5.10 Adding Some Validation


app/models/article.rb  모델 파일은 간단합니다. 


class Article < ActiveRecord::Base
end


아직 충분한 내용은 아니다. 하지만, Article class가 ActiveRecord::Base를 상속받은 것은 중요하다. Active Record는 기본적인 database CRUD(Create, Read, Update, Destroy) 기능들을 쉽게 처리할 수 있도록 해준다. 게다가, 정교한 검색을 제공하며, 또다른 모델을 동시 처리할 수 있다. 


Rails는 당신이 모델에 보낸 정보를 처리할 수 있는 방법들을 제공한다.  app/models/article.rb 파일을 열고 아래와 같이 수정하자.


class Article < ActiveRecord::Base
  validates :title, presence: true,
                    length: { minimum: 5 }
end


위 내용이 적용되면, 모든 기사의 제목을 최소 5자로 설정하게 설정하도록 할 수 있다. Rails는 여러가지에 대한 검증을 할 수 있다. 검증에 대해서는  Active Record Validations를 참고하라.


여기서는 @article.save를 호출할 때, 글에 어떤 문제가 있을 경우 false를 리턴시켜 볼 것이다. app/conrollers/articles_controller.rb를 다시 열어보면,  @article.save의 리턴값을 확인하지 않는다는 것을 알 수 있다. 그래서 @article.save가 실패할 경우, 유저에게 실패를 알리고, 돌아갈 수 있게 하는게 필요하다. 그렇게 하려면, app/controllers/articles_controller.rb 파일 안의 new와 create를 아래와 같이 바꿔보자.

def new
  @article = Article.new
end
 
def create
  @article = Article.new(article_params)
 
  if @article.save
    redirect_to @article
  else
    render 'new'
  end
end
 
private
  def article_params
    params.require(:article).permit(:title, :text)
  end










저작자 표시 비영리 동일 조건 변경 허락
신고
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의 역할과 작동방법을 알아 보았다. 


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


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