오픈마루에서 진행된 첫번째
데브데이에 대한 내용입니다. 다른 후기들은
여기에서 보실 수 있습니다.
같이 루비 튜토리얼 세션을 진행하신 deepblue 님의 후기는
여기에서 보실 수 있습니다.
아래는 루비 튜토리얼 세션에서 진행된 내용 입니다.
튜토리얼1 - [멘토:강문식, 유지만] Ruby반 - 세미나룸#4
- 최종참가자: 10명 - 날개, 김성안, 브루펜시럽, 우주, 트위니, Celeste, Dano, iron, Raven, 이두원
참고자료
링크
문서
소스
셈플 어플리케이션 만들기 (with ActiveResource)
목표 :
ActiveRecord 를 사용하지 않고 ActiveRecord 의 REST 버젼이라고 할 수 있는 ActiveResource 만을 사용해서 스프링노트의 페이지를 다룰 수 있는 게시판을 만들어 본다.
step1 어플리케이션 생성
- > rails snote
- > cd snote
-
step2 EdgeRails
- > svn co http://svn.rubyonrails.org/rails/trunk vendor/rails
Edge Rails 란 레일스 최신 개발소스를 의미함.
(참고) vendor/rails 디렉토리에 최신의 레일스 소스를 내려받으면 Edge 로 개발하는 환경이 갖추어 진다.
-
vendor/rails/railties/lib/initializer.rb 에 아래와 같은 메소드가 존재.
-
def framework_root_path
-
defined?(::RAILS_FRAMEWORK_ROOT) ? ::RAILS_FRAMEWORK_ROOT : "#{root_path}/vendor/rails"
-
end
step3 오픈마루 인증센타를 통해서 인증하기
인증키 받기 : 도움말 참조
step3.1 레일스 환경설정 수정
config/springnote.yml 파일 생성후 아래와 같은 정보 추가.
-
springnote:
-
open_id: 자신의오픈아이디
-
user_key: 인증센타를통해받은유저키
-
app_key: 인증센타를통해받은어플리케이션키
step4 Scaffold 를 이용해서 모델, 컨트롤러, 뷰 생성
- > script/generate scaffold page title:string source:text
step5 ActiveRecord 를 사용하지 않도록 설정 / 패치
step5.1 config/environment.rb 파일 수정
ActiveRecord 를 사용하지 않도록 설정
- config.frameworks -= [ :active_record ]
필수 세션 정의 필요
- config.action_controller.session = {
:session_key => "_board_session",
:secret => "some secret phrase"
}
스프링노트 API 인증에 필요한 설정 파일 내용 로딩 (springnote.yml)
- CONFIG = YAML::load_file("#{RAILS_ROOT}/config/springnote.yml")
(참고 : 개발환경에서 상세하게 에러메시지를 남기도록 설정) : config/environmants/development.rb 파일내용중 아래와 같이 수정
- config.whiny_nils = false # 원래는 true
step6 Monkey Patch
lib/initializer.rb 작성
- 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 한 라이브러리 파일 로딩하도록 수정
- require 'lib/initializer.rb'
step7 컨트롤러 수정 (app/controller/pages_controller.rb)
- class PagesController < ApplicationController
before_filter :update_site
- ......
- private
- def update_site
- user_id = CGI.escape(CONFIG['springnote']['open_id'])
- password = [ CONFIG['springnote']['user_key'], CONFIG['springnote']['app_key'] ].join(".")
- Page.site = "http://#{user_id}:#{password}@api.springnote.com/"
- end
step8 모델 수정 (app/model/page.rb)
- class Page < ActiveResource::Base
set_primary_key 'identifier'
def to_param
identifier.to_s
end
end
step9 뷰 수정 (app/views/pages/show.html.erb)
- <p>
- <b>Title:</b>
- <%=h @page.title %>
- </p>
- <p>
- <b>Source:</b>
- <%=h @page.source %>
- </p>
- <p>
- <%=@page.source %>
- </p>
- <%= link_to 'Edit', edit_page_path(@page) %> |
- <%= link_to 'Back', pages_path %>
step10 업데이트 오류 해결
app/conteollers/page_controller.rb 에서 update 부분을 수정하면 됨.
# ActiveResource 에는 update_attributes 가 구현이 안되어있다. 때문에 아래와 같이 수정하고 명시적으로 save 를 호출해주면 됨.
-
def update
-
@page = Page.find(params[:id])
-
respond_to do |format|
-
params[:page][:identifier] = params[:id]
-
if @page.attributes = params[:page]
-
@page.save
-
flash[:notice] = 'Page was successfully updated.'
-
format.html { redirect_to(@page) }
-
format.xml { head :ok }
-
else
-
format.html { render :action => "edit" }
-
format.xml { render :xml => @page.errors, :status => :unprocessable_entity }
-
end
-
end
-
end
기타 : 레일스 콘솔 사용 관련
개발환경 레일스 콘솔 실행 : script/console
콘솔상에서 아래와 같이 한줄씩 입력해보고 나오는 결과를 참고해보자.
- >> app.class
>> app.get "/pages/페이지번호"
>> app.get "/pages"
>> app.response.body
>> app.cookies
>> helper.text_field_tag :foo
- >> app.methods.grep(/_path$/).sort
- >> _ (마지막 아웃풋을 보여줌)
- >> 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 :
- 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_ |
이 글은 스프링노트에서 작성되었습니다.