싸미~*

Rails) flash 사용법

.Tip

flash 는 Rails Application에서의 Action과 Action간에 정보를 공유하기 위해 만들어진 기능이다.

HTTP Protocol은, 기본적으로 상태가 유지되지 않는 프로토콜인데,

만약 특정 액션에서 에러가 발생하여, Browser가 다른 액션으로 Redirect되는 경우,

이전 액션에서 발생한 Error Message를 확인할 수 있는 방법 이 없게 된다.

(여기서 Flash 는, Flash MX 등에서 사용하는 Flash가 아니다)

 

Flash기능은, 이런 경우에 이전 Action에서, 다음 액션으로 정보를 넘겨주는 것을 가능하게 한다.

(이상 '웹 개발 2.0 루비온 레이슬' -황대산 지음 에서 발췌)

그러면, 사용법을 알아보자.

app/controller/user_controller.rb
class UsesController < ApplicationController
    def list
        @users = User.find(:all)
        @note = flash[:note]
    end
    ..
    def create
        @user = User.new(params[:user])
        if @user.save
            flash[:note] = "새로운 사용자가 추가되었습니다"
            redirect_to(:action => 'list')
        end
end

create라는 액션메소드에서,

사용자를 추가하여, DB에 저장한후, list라는 액션메소드로 건너간다.

이때 'flash' 에 메세지를 저장하고,

이를 list 액션메소드에서 활용하는 것을 볼 수 있다.

View 에서 다음처럼 쓸수 있을 것이다.


    ...
    
        <% if @flash[:note] -%>
            <%= @flash[:note] %>
        <% end %>
     ..

신고

[Ubuntu] HOWTO: Build a Ruby (Rails) Environment

.Tip

# 다음 명령들을 수행한다.

apt-get install ruby
apt-get install rubygems
gem update --system
gem update
apt-get install ruby1.8-dev
apt-get install libzlib-ruby
apt-get install libyaml-ruby
apt-get install libdrb-ruby
apt-get install liberb-ruby
apt-get install rdoc
apt-get install zlib1g-dev
apt-get install libopenssl-ruby

# Mongrel 설치

gem install daemons gem_plugin mongrel mongrel_cluster --include-dependencies

..dependency을 확인하여 각각 설치할 것인지 물어본다.


#필수

  • apt-get install ruby rubygems irb ri rdoc ruby1.8-dev build-essential
  • gem install rails --include-dependencies
  • export PATH=$PATH:/var/lib/gems/1.8/bin
(참고 특정 버전으로 Install 하기 위해서는 다음처럼 하면 된다.
 $> gem install -v=1.2.3 rails )

#옵션

  • apt-get install libmysql-ruby mysql-server
    (mysql이 설치되어있다면, mysql-server는 패스)
  • apt-get install libopenssl-ruby
    (SSL Support)
  • apt-get install imagemagick
    dgpk -l | grep magick

    apt-get install libmagick9-dev
    gem install rmagick

    (ImageMagick Support)

#참고

  • Ubuntu 7.04 (Fiesty) 경우, 다음 버전 필수

    Rails >= 1.2.1 , Ruby >= 1.8.2 , Ruby 1.8 >= 1.8.5, Rubygmes >= 0.9.0
신고

[Ruby] XML Builder 와 REXML

.Tech

Ruby(Rails)을 통해서, XML Parsing과 Build시 다음 두개의 Class(Or Module)을 사용한다.

1. Builder

Ruby Class중에 "Builder"을 통해서, XML 을 만들어 낼 수가 있다.
(참고 = XML.com의 "Createing XML with Ruby and Builder")

2. REXML

XML Parser중 작고, 빠른편이다.
(참고 = Germane Software의 XML소개)

사용법은 위 두개 참고 사이트를 보면 된다.

여기서 언급할 것은, Builder을 통해서 XML을 생성 할 때,

주로 String으로 XML을 담아왔었다.

 

다음은 이를 파일로 담아오는 방법이다.

require 'builder'

file = File.new("result.xml", "w")
$stdout = file

xml = Builder::XmlMarkup.new(:target => $stdout)
...
신고

[Ruby] Sort 방법 (Struct - 구조문 이용)

.Tech

1. 기본 Hash 정렬

         참고] Ordered Hash는 , Hash에 값을 대입시 순서대로 저장을 한다.

                   (여기 참고)
require 'ordered_hash' h = OrderedHash.new(0)
h["1st"] = 5
h["2nd"] = 3
h["3th"] = 7
#Hash의 Value의 내림차순으로 정리하여 배열로 지정
a = Array.new(0)
a = h.sort { |a,b| b[1]<=>a[1] }

[결과]
 a = [["3th",7],["1st",5],["2nd",3] ]
2. Struct Type 정렬
 require "ordered_hash"

h1 = OrderedHash.new(0)
s1 = Struct.new(:name, :zip)

h1["2020"] = s1.new("smith", 100)
h1["1010"] = s1.new("tom", 200)

#key (2020 or 1010) 별로 정렬

h1.sort {|a,b| b[0]<=>a[0]}

#Struct "zip" 별로 정렬

h1.sort {|a,b| b[1].zip<=>a[1].zip}



3. OpenStruct Type정렬
          OpenStruct는, 동적으로 Struct에 멤버을 추가할 수 있는 특징이 있다.
 require "ostruct"

h2 = OrderedHash.new(0)
h2["1010"] = OpenStruct.new(:name => "smith", :zip=>100)
h2["2020"] = OpenStruct.new(:name => "smith", :zip=>100)

#Struct "zip"별로 정렬

h2.sort {|a,b| b[1].zip<=>a[1].zip}
신고

[Ruby] Module 활용

.Tip

참고] Programming Ruby - 2nd , Chapter 9.Modules

==========================================================================

Module 은 여러 Method, Class, Constant들을 그룹핑 해준다.

두가지 이점이 있는데

1. Module은 'Namespace'을 제공하고, 이들간의 충돌을 막는다.

2. Mixin 을 구현할 수 있다. (뒤에 설명)

 

## Namespaces

큰 Ruby Program이 있을때, 자연스레 재사용코드 단위들을 묶으려 할 것이다.

이를 클래스별로, 파일들에 나눌 것이다.

하지만, 재사용코드라 해서 Class로 구분짓는 행위가 부자연스러울때가 있다.

....

Module 메카니즘에서, Module은 "Namespace"을 정의한다.

다음은 Module "Trig"와 "Moral"을 정의한 것이다.

image image

모듈은 Class Constant와 비슷한 형태의 이름을 갖는다.(첫글자는 대문자)

또한 Method 정의 & 사용 또한 비슷하다.

Third program에서 이 모듈들을 사용할때는 다음과 같다.

image

Module 이름과 두 콜론으로 Constant 참조가능하다.

 

## Mixin

Module의 Mixin을 통하여, 다중상속(multiple inheritance)에 대한 필요성을 대체할 수 있다.

원래 Module은 Class가 아니기 때문에, Instance을 가질 수 없다.

하지만, Class 정의 내에서 module을 포함시킬 수 있다.

이런 경우에는, 모듈의 모든 Instance method는 Class 내의 method처럼 동작한다.

(이를 Mixed in 되었다 한다, minxed-in module은 superclass라 보는게 편하다)

image

Class 'Phonograph'와 'EightTrack' 안에 "Debug" Module을 include했다.

따라서, 이 두 Class는 Debug모듈의 'who_am_i'라는 instance 메서드을 사용할 수가 있다.

즉. 다음처럼 사용이 가능하다.

image

[참고]

1.  C에서 Include는 해당 파일의 내용들을 넣는 것이지만,

  Ruby에서의 Include는 단지 'Named module'을 참조하는 역할만 한다.

  Module이 다른 파일에 있다면, 'include'이전에 'require'를 필요로 한다.

2. 위에서 Module을 참조하기만 하기 때문에,

  프로그램 동작중에 Module안의 method를 바꾸면, 바로 적용이 된다

신고

[Ruby] 유니코드 확장

.Tip

Ruby의 문자열은 Byte열로 구현되어있어서, 루비 문자열 객체의 메소드는 기본적으로 바이트 단위로 처리한다.

한국어와 같은 Multi-byte 문자를 처리할때 예상치 못한 결과가 발생할 수 있다.

 

"디자인"과 같은 한글 문자열은 3글자로 구성되어있지만, 바이트 단위로는 9 바이트를 차지한다.

따라서, 바이트 기반 메소드인 "length"을 사용하면, 3 대신에 9를 리턴한다.

 

이때 chars라는 Proxy메소드를 사용하여, 유니코드 기반의 메소드를 지원하고 있다.

 

다음은 그 예이다.

>> puts "디자인"
디자인

>> "디자인".length
==> 9

>> "디자인".chars.length
==> 3
신고

[Ruby] Iconv 사용법

.Tip

다음은 ruby에서 iconv을 사용하는 방법이다.

# module 선언
require 'iconv'

...

# EUC-KR을 UTF-8로 변환하기 위한 선언
conv = Iconv.new('UTF-8', 'EUC-KR')

#Convert 'document'
converted = conv.iconv(document)

 

Tip1. Document내 확장 완성형 문자가 존재하는 경우, 에러발생

(참조 : superkdk in the NET)

위 참조에서 설명한 대로,

"//IGNORE"옵션을 붙이면, 처리하지 못하는 문자열을 무시하도록 할 수 있다고 한다.

# EUC-KR을 UTF-8로 변환하기 위한 선언
conv = Iconv.new('UTF-8//IGNORE', 'EUC-KR')

 

Tip2. Ruby에서 Ruby-Feedparser의 사용시 인코딩 문제

(참조 : superkdk in the NET)

"textconverters.rb" 에서 "toUTF8"을 수정

자세한 것은 참조사이트 참고

신고

RubyOnRails - Logger 기능

.Tech

Rails App에는 3가지 구동 모드가 있다.  [Development/ Production/ Test]

Mongrel 웹서를 이용하는 경우, 다음 처럼 구동모드를 선택할 수가 있다.

mongrel_rails start -e development -d -p <포트번호>

mongrel_rails start -e production -d -p <포트번호>

mongrel_rails start -e test -d -p <포트번호>


이 구동모드에 따라 각각 log파일이 따로 존재한다.

<rails_app_path>/log/development.log

<rails_app_path>/log/productiont.log

<rails_app_path>/log/test.log

 

Rails에서 제공되는 logging 이외 다른 log을 기록하고 싶다면 다음처럼 꾸리면 된다.

 

## Log 선언

표준 or 파일 입출력 모두 가능함

logger = Logger.new(/입출력/)

logger = Logger.new(STDOUT)

logger = Logger.new("hi.log")

 

## Log 레벨 지정

log 레벨은 다음과 같다

[DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN]

logger.level = Logger::INFO 
ogger.level = Logger::DEBUG

 

## Log 사용

logger.level "LOG Message" or
logger.level ("LOG Message")
logger.info("Application starting")
Level을 최소 Info로 지정해야 파일에 log가 남는다.
logger.FATAL("Application terminating")
level을 최소 Fatal로 지정해야 파일에 log가 남는다.
  

다음은 내가 사용하고 있는 예제이다.


## <username>.log 로 logging을 하되,
     log 파일의 크기 제한은 100k임
     단. 100k 파일을 최대 10개까지 생성할수 있되,
      10을 기준으로 반복/갱신 된다.

logger = Logger.new("./log/#{username}.log", 10, 100*1024)

## log level은 "DEBUG"로, 모든 로그을 뽑아내고자 한다.
  (개발모드라서)
   양산(?) 버전에서는 FATAL등으로 처리하면 편할듯

logger.level = Logger::DEBUG

## log을 남길 메세지를 정한다. 
   __LINE__ : 
   현재 파일의 line number을 나타냄. (파일이름은 __FILE__)

logger.info "#{__LINE__}  : user login time = #{login_time}"

logger.fatal "#{__LINE__} : No user id!!!!!!!"

신고

[Rails] Ordered Hash

.Tech/Linux

* ruby에서 hash을 쓰다보면,

   Hash table에 입력순서대로 값이 들어가질 않는다.

  이 Ordered hash을 사용하게 되면, 입력 순서대로 값이 입력된다.


Ordered Hash을 위해서, 몇가지 Gem을 설치하였다.

GoodLibs                   - 현재 사용중인 것 (2006.05 이후로 업데이트 이루어지지 않음)

Facets - Dictionary    - 좀더 유명한 Gems, 하지만 "Sort" method을 지원하지 못한다.


Sort method 을 지원하기 위하여, GoodLibs을 다시 설치하였는데,

"File is not to unload" 라는 에러 발생한다.


Gem 설치하고, Ruby Path가 잡혀있는데도 이런 상황.


혹시나 해서, GoodLibs 설치된 폴더에서

"ruby ordered_hash.rb" 을 했더니 되더라...ㄷㄷㄷㄷ

(참고 . ordered_hash 위치

  Path : ./ruby/lib/ruby/gems/1.8/gems/GoodLibs-1.2006.05.23/lib)


참고로 Ordered Hash을 지원하는 다른것도 소개함

Ruby/RBTree


p.s] xml을 다루는 경우, builder 모듈을 많이 사용하는데,

"gem install builder"하면 설치 가능하다.


신고