오픈마루 첫번째 데브데이 – RubyTutorialSession 자료 및 후기


오픈마루에서 진행된 첫번째 데브데이에 대한 내용입니다. 다른 후기들은 여기에서 보실 수 있습니다.
같이 루비 튜토리얼 세션을 진행하신 deepblue 님의 후기는 여기에서 보실 수 있습니다.

아래는 루비 튜토리얼 세션에서 진행된 내용 입니다.

튜토리얼1 – [멘토:강문식, 유지만] Ruby반 – 세미나룸#4

– 최종참가자: 10명 – 날개, 김성안, 브루펜시럽, 우주, 트위니, Celeste, Dano, iron, Raven, 이두원

참고자료

링크

문서

  • REST-cheatsheet.pdf
  • rest.pdf
  • REST_ARes.pdf

소스

  • snote.tar.gz  (vendor/rails 를 제외한 소스입니다)

셈플 어플리케이션 만들기 (with ActiveResource)

목표 :

ActiveRecord 를 사용하지 않고 ActiveRecord 의 REST 버젼이라고 할 수 있는 ActiveResource 만을 사용해서 스프링노트의 페이지를 다룰 수 있는 게시판을 만들어 본다.

step1 어플리케이션 생성

  1. > rails snote
  2. > cd snote
  3.  

step2 EdgeRails

  1. > svn co http://svn.rubyonrails.org/rails/trunk vendor/rails

Edge Rails 란 레일스 최신 개발소스를 의미함.

(참고) vendor/rails 디렉토리에 최신의 레일스 소스를 내려받으면 Edge 로 개발하는 환경이 갖추어 진다.

  1. vendor/rails/railties/lib/initializer.rb 에 아래와 같은 메소드가 존재.

  2. def framework_root_path

  3.   defined?(::RAILS_FRAMEWORK_ROOT) ? ::RAILS_FRAMEWORK_ROOT : “#{root_path}/vendor/rails”

  4. end

step3 오픈마루 인증센타를 통해서 인증하기

인증키 받기 : 도움말 참조

step3.1 레일스 환경설정 수정

config/springnote.yml 파일 생성후 아래와 같은 정보 추가.

  1. springnote:

  2.   open_id: 자신의오픈아이디

  3.   user_key: 인증센타를통해받은유저키

  4.   app_key: 인증센타를통해받은어플리케이션키

step4 Scaffold 를 이용해서 모델, 컨트롤러, 뷰 생성

  1. > script/generate scaffold page title:string source:text

step5 ActiveRecord 를 사용하지 않도록 설정 / 패치

step5.1 config/environment.rb 파일 수정

ActiveRecord 를 사용하지 않도록 설정

  1. config.frameworks -= [ :active_record ]

필수 세션 정의 필요

  1. config.action_controller.session = {
           :session_key => “_board_session”,
           :secret => “some secret phrase”
    }

스프링노트 API 인증에 필요한 설정 파일 내용 로딩 (springnote.yml)

  1. CONFIG = YAML::load_file(“#{RAILS_ROOT}/config/springnote.yml”)

(참고 : 개발환경에서 상세하게 에러메시지를 남기도록 설정) : config/environmants/development.rb 파일내용중 아래와 같이 수정

  1. config.whiny_nils = false # 원래는 true

step6 Monkey Patch

lib/initializer.rb 작성

  1. module Rails
      class Initializer
       # Thanks to http://dev.rubyonrails.org/ticket/6795
       def load_observers
         return unless configuration.frameworks.include?(:active_record)
         ActiveRecord::Base.instantiate_observers
       end
      end
    end

config/environment.rb 파일에 monkey_patch 한 라이브러리 파일 로딩하도록 수정

  1. require ‘lib/initializer.rb’

step7 컨트롤러 수정 (app/controller/pages_controller.rb)

  1. class PagesController < ApplicationController
      before_filter :update_site

  2. ……

  3.   private
  4.   def update_site
  5.     user_id = CGI.escape(CONFIG[‘springnote’][‘open_id’])
  6.     password = [ CONFIG[‘springnote’][‘user_key’], CONFIG[‘springnote’][‘app_key’] ].join(“.”)
  7.     Page.site = “http://#{user_id}:#{password}@api.springnote.com/”
  8.   end

step8 모델 수정 (app/model/page.rb)

  1. class Page < ActiveResource::Base
      set_primary_key ‘identifier’

      def to_param
       identifier.to_s
      end
    end

step9 뷰 수정 (app/views/pages/show.html.erb)

  1. <p>
  2.   <b>Title:</b>
  3.   <%=h @page.title %>
  4. </p>
  5. <p>
  6.   <b>Source:</b>
  7.   <%=h @page.source %>
  8. </p>
  9. <p>
  10. <%=@page.source %>
  11. </p>
  12. <%= link_to ‘Edit’, edit_page_path(@page) %> |
  13. <%= link_to ‘Back’, pages_path %>

step10 업데이트 오류 해결

app/conteollers/page_controller.rb 에서 update 부분을 수정하면 됨.
     # ActiveResource 에는 update_attributes 가 구현이 안되어있다. 때문에 아래와 같이 수정하고 명시적으로 save 를 호출해주면 됨.

  1.   def update

  2.     @page = Page.find(params[:id])

  3.     respond_to do |format|

  4.       params[:page][:identifier] = params[:id]

  5.       if @page.attributes = params[:page]

  6.         @page.save

  7.         flash[:notice] = ‘Page was successfully updated.’

  8.         format.html { redirect_to(@page) }

  9.         format.xml  { head :ok }

  10.       else

  11.         format.html { render :action => “edit” }

  12.         format.xml  { render :xml => @page.errors, :status => :unprocessable_entity }

  13.       end

  14.     end

  15.   end

기타 : 레일스 콘솔 사용 관련

개발환경 레일스 콘솔 실행 : script/console

콘솔상에서 아래와 같이 한줄씩 입력해보고 나오는 결과를 참고해보자.

  1. >> app.class
    >> app.get “/pages/페이지번호”
    >> app.get “/pages”
    >> app.response.body
    >> app.cookies
    >> helper.text_field_tag :foo
  2. >> app.methods.grep(/_path$/).sort
  3. >> _    (마지막 아웃풋을 보여줌)
  4. >> y _

기타2 : 엑티브리소스 참고

오류코드

200 – 399:: Valid response, no exception
404:: ActiveResource::ResourceNotFound
409:: ActiveResource::ResourceConflict
422:: ActiveResource::ResourceInvalid (rescued by save as validation errors)
401 – 499:: ActiveResource::ClientError
500 – 599:: ActiveResource::ServerError

Table 1.1: HTTP Verbs and REST-URLs
HTTP Verb REST-URL Action URL without REST
GET /projects/1 show GET /projects/show/1
DELETE /projects/1 destroy GET /projects/destroy/1
PUT /projects/1 update POST /projects/update/1
POST /projects create POST /projects/create

Table 1.2: Standard Path methods
Path Method HTTP Verb Path Requested Action
projects_path GET /projects index
projects_path(1) GET /projects/1 show
new_project_path GET /projects/new new
edit_project_path GET /projects/1;edit edit
projects_path POST /projects create
projects_path(1) PUT /projects/1 update
projects_path(1) DELETE /projects/1 destroy
REST Routing

config/routes.rb :

  1. map.resources :projects

map.resources :projects

Route Generated Helper
projects projects_url, projects_path
project project_url(id), project_path(id)
new_project new_project_url, new_project_path
edit_project edit_project_url(id), edit_

이 글은 스프링노트에서 작성되었습니다.

  • Pingback: Ocomet Windup()

  • Ocomet

    저도 이런 기술적인 내용을 기술해봐야 할터인데..
    어쨋든 트랙백 걸고 갑니다.. +___________+