38장.Multibutton Form


폼에 submit버튼이 여러개 일때 해당버튼을 구분하는방법.

폼에 submit버튼은 모두 create로 간다.
그렇기 때문에 만약에 두개의 submit버튼이 있을때 구분을 하려고 하는데 그방법을 설명한다.
일반적으로는 parameter에 hash타입으로 commit:버튼명으로 가는데
만약에 rhtml에 <%= submit_tag 'Preview',:name => 'preview_button'%>이라고하면
parameter에 hash타입으로 preview_button:Preview으로 간다. 이렇게  :name 심벌을 이용하여 수정할수 있다.

39장.Customize Field Error


레일즈에서 유효성체크에서 오류가 났을때 해당필드를 원하는 형태로 보여주는 방법을 설명하고 있음.


레일즈에서는 기본적으로 validation을 해주는 기능이 있다.
그래서 값을 않넣거나 그러면 기본적으로 테두리에 빨간div를 감싸게 되는데
그것이 맘에 안든다면 environment.rb에서
ActionView::Base.field_error_proc=Proc.new do|html_tag,instance|
  "<span class='field_error'>#{html_tag}</span>"
do
이렇게 수정하고 css를 수정하면 자신이 원하는 대로 보일수 있음.
html_tag는 유효성검증이 안된 html tag가 들어오고 instance에는 error객체가 있음.
참고:How to Change Validation Error Display


40장.Blocks in View


블록을 포함한 helper메소드를 만들어 본다.

굉장히 유용한 팁인것 같다.
sample
# rhtml
<% admin_area do %>
<%= link_to "Edit Task", edit_task_path(@task) %>
<% end %>
# application_helper
def admin_area(&block)
concat('<div class="admin">', block.binding)
block.call
concat("</div>", block.binding)
end

41장.Conditional Validations


일반적으로 모든 유효성체크는 매번 검사하게 되어있다.
하지만 매번검사하는것을 원치 않을때는 :if => :some_method이렇게
조건을 주어서 조건에 맞는경우만 유효성 검사를 할수 있게 할수 있다.
sample
validates_presence_of :password, :if => :should_validate_password?
def should_validate_password?
  updating_password || new_record?
end



42장.with_options


보통 많은 레일즈 메서드는 마지막에 해시를 받게된다.
그런데 만약에 여러개의 매소드중에 해시로 받는 부분이 겹친다면 with_options으로
좀더 간단히 표현할수 있다.

sample
routes.rb에서 아래와 같다면
map.login 'login',:controller => 'session',:action=>'new'
map.logout 'logout',:controller => 'session',:action=>'destory'
아래와 같이 수정할수 있다.
map.with_options :controller => 'session' do |sessions|
  sessions.login 'login',:action=>'new'
  sessions.logout 'logout',:action=>'destory'
do
Posted by 전용우

33장.Making a Plugin

대기중(이건 제가 한번 자세히 해보고 포스팅하겠습니당)ㅡㅡ;


34장.Named Routes

routes.rb에서 커스텀 라우터을 사용하여 핼퍼메소드을 이용해 좀 더 쉽게
link를 만드는방법.


routes.rb에서 map.resourse를 이용하여 간단히 만든다음 view에서 핼퍼메소드를 이용.

35장.Custom REST Actions

RESTful 환경만들기
레일즈에서는 좀더 쉽게 rest[각주:1]환경을 지원한다.
routes.rb 에 map.resources :tasks라고 하면 새로운 라우터 7개[각주:2]와 4개의 핼퍼메소드[각주:3]를 사용할수 있게된다.

하지만 이모든것들이 모두 필요한것이 아니다.특정 리소스에대해 특별히 처리하고 싶을때는
:collection=>{액션=>http request}을 사용하면된다.그리고 특별한 액션을 추가하고 싶을경우는 :member=>{액션=>http request}을 사용하면되고 새로운 자원을 만드는 특수한 액션은 :new=>{액션=>http request}로 만들수 있다.

참고로 delete같은경우는 실제로 request를 delete로 보내는것이 아니라 자바스크립트로 전송하기 때문에 자바스크립트가 꺼져있는경우는 작동을 하지 않는다.

참고:레일즈와 함께하는 에자일 웹개발 20장

36장.Subversion on Rails

rails에 svn을 사용하는 방법을 다룹니다.
여기서는 저와 다른 맥의 TextMate을 사용하고 있습니다.
저같은 경우는 aptana를 사용하고 있는데 aptana같은 경우는 일반 이클립스와 동일하게 사용
하시면 되지만 그냥 url업데이트할때 에러가 날겁니다.
Mylar의 버전이 바르지 않다고 나옵니다. 그럴땐 Mylar부분을 헤제한후 사용하면됩니다.
참고글:Aptana + Radrails - how to import a project from SVN ?

37장.Simple Search Form

이번장에서는 모델이 필요없는 폼인경우 작성법을 말하고 있다.
search form같은 경우는 모델이 필요없다.
모델이 필요없는 폼인 경우에는 form_tag를 사용하여 파라메터만 넘긴다.
아래와 같이 사용.
form_tag 컨트롤러_path do
    .....
end
  1. 간단히 말하면 리소스들을 4가지액션(get,put,post,delete)들로 조작하는것 입니다,좀더 자세한 것들은 REST을 확인하기 바랍니다. [본문으로]
  2. index,create,new,show,update,edit,destory [본문으로]
  3. user_path, hash_for_new_user_path, users_url [본문으로]
Posted by 전용우

29장.group_by Month

group_by을 이용한 달나누기.
something.group_by{|t| 그룹을 짓는 기준}으로 사용되고 반환은 hash로 반환된다.

30장.Pretty Page Title

content_for 와 helper메소드를 이용하여 title을 이쁘게 하는방법.
ruby의 특성을 잘 나타낸강의 이라고 생각함.^^;;
8장.Layouts and content_for 같이 보면 좋음.


31장.Formatting Time

DATE_FORMATS을 이용한 데이터 포맷팅 방법.
environment.rb에서
TIME::DATE_FORMATS을 해쉬타입으로 지정하고 사용하면됨

32장.Time in Text Field

Date타입일경우 보통 select를 사용하는 select를 text필드로 바꾸는 방법.
Time.parse를 이용하여 text필드를 쉽게 수정할수 있게 한다.
ruby chronic을 이용하면 좀더 다양하게 수정할수 있음.
ex)today,next day등...
Posted by 전용우

26장.Hackers Love Mass Assignment

원하지 않는 컬럼을 임의로 등록하려고 할때
attr_protected 을 이용하여 막는 방법.
하지만 접근이 불가능한 컬럼을 적기가 많거나 귀찬다고 한다면 attr_accessible을 이용하면됨.
 attr_accessible은 적은것만 빼고 모든것이 등록이 불가함.

27장.Cross Site Scripting

cross site scripting에 대한 방지법.
이스케이프하는 방법이 나옴.
이스케이프는 h(sometihg) 이렇게 사용하면됨.
레일즈 에자일웹개발에서도 무조건 문장에 이스케이프를 하는 방법을
습관들이라고 나옵니다.

28장.in_groups_of

in_groups_of를 이용하여 행을 나누는 방법.
in_groups_of는 배열을 그룹을 짓는 핼퍼매소드
in_groups_of(4)하면  4개씩그룹을 짓는다.하지만 갯수가 모자르면 nil을 들어감.
하지만 in_groups_of(4,false)을 하면 nil이 아니라 아무것도 안들어감.
in_groups_of(4,defaultvalue)을 하면 그룹을 짓다가 부족한경우 defaultvalue가 들어감.

Posted by 전용우
22장.Eager Loading

이번장은 perloading에 대해서 나온다.
예를들면 post 1---* comment란 관계가 있는데.(굳이 1--*관계가 아니라도 상관없음.)
post = Post.find(:all)

for post in @post
    post.name
    post.comment.name
do

이렇식으로 하면 post.comment.name 이부분이 for문을 돌면서 매번 패칭을 한다.
그래서 이방법을 해소하기 위해 :include을 사용하면 미리 해당 건을 가져 오기 때문에
한번의 패칭으로 같은 효과를 낼수 있다.

post = Post.find(:all)  -> post = Post.find(:all,:include=>:comments) 로 바꿔주면 됨.

하지만 이방법은 left outer조인이 지원을 해야한다.즉,오라클 8i는 안됨.


23장.Counter Cache Column

이번장은 counter cache기법이다.
has_many 관계에서 이글에 딸린 커멘트수 같은걸 구할때 매번 조인을해서 구하는것이
아니라 캐싱하는기법.

자식 액티브래코더에 belongs_to :부모이름_cache => ture을 정하고
부모테이블에 자식이름_count 컬럼을 만들어 자동으로 캐싱됨.

24장.The Stack Trace

stack trace로 디버깅하는방법.
좋긴한데... textmate가 있어야한다.아쉽..RDT로는 안되나?..한번 확인해봐야겠다

25장.SQL Injection

다른 언어와 같이 파라메터를 바인딩하는것으로 sql injection을 막는방법.
일반 언어와 같음.
Posted by 전용우
19장~21장은 관리자 개발시 보통일반하면과 따로 개발하는데 이것을 좀더 쉽게 개발하는
방식에 대해 설명함.(현재 진행중)

19.Where Administration Goes

첫번째로는 관리자 화면과 일반화면을 합치는 방법.


20.Restricting Access

필터링을 이용한 권한제어하기(필터링과 유저 핼퍼매소드가 핵심)

21.Super Simple Authentication

간단한 로그인을 통한 권한관리(한번 플러그인 깔아보고 해볼것)
Posted by 전용우
13장.Dangers of Model in Session

session에 모델을 넣으면 데이터베이스와 일치하지 않는경우가 발생됨.
그래서 id만을 저장하고 그이후에 fetch하는것이 올바른 방법.


14장.Performing Calculations on Models

associations에서 계산방법을 향상시키는 방법.


15장.Fun with Find Conditions

find_by 매소드를 이용하여 좀더 편하게 검색하기


16장.Virtual Attributes


이름과 같은 경우 성과 이름이 따로 떨어져 있는데
이름이란 가상속성을 만들어서 사용하는방법.


17장.HABTM Checkboxes

habtm에서 check box를 만드는방법.


18장.Looping Through Flash


flash는 보통 오류메세지를 보낼때 사용되는데
여러개의flash메세지가 보여질경우 loop을 이용하는 방법.
Posted by 전용우
10~12장은 Refactoring 하는 방법을 다룸.

10장.Refactoring User Name Part 1

이름을 리팩토링하는 기법.
자주 사용할만것 내용.
핼퍼 매소드와 정의매소드를 잘사용해야될것 같음.

11장.Refactoring User Name Part 2

TDD를 통한 리팩토링 기법.
좀더 루비스러운(?)코드로 바뀌는 과정.

12장.Refactoring User Name Part 3

testcase를 다시 리팩토링 하는 방법.
Posted by 전용우
7장.All About Layouts

layout 사용법
views/layout폴더에 application.rhtml을만들고
레이아웃을만들고 컨텐츠가 들어갈곳에 <%= yield %>로 하면 전체 레이아웃이 잡힘.
각 컨트롤러마다 레이아웃을 잡고 싶을경우
프로젝트명.rhtml로 만들면 자동으로 프로젝트명이 잡힘.
아니면 컨트롤러에서 layout "프로젝트명"으로 표시하면 해당 레이아웃이 적용.

그래서 사용자 마다 같은 페이지라도 레이아웃을 다르게 표현하고 싶을때가 있는데
그럴땐 심벌을 사용하여 적용.

render명령으로도 layout을 적용가능.

8장.Layouts and content_for

보통 application에서 해당 컨트롤러 레이아웃을 가져오는 방법을 사용하는데
특정 컨트롤러에서 application의 레이아웃을 바꾸고 싶을때가 있다. 그럴때
content_for의 핼퍼매소드를 이용하며됨.

9장.Filtering Sensitive Logs

비밀번호같은 중요한정보를 로그에 노출되지 않도록 filltering하는방법.
application 컨트롤러에
filter_parameter_logging "이름" 주면 logging에서 필터링되서 나옴.
(application에 적용하면 모두 적용됨)

Posted by 전용우

1.Caching with Instance Variables

User.find(session[:id]) 이렇게 사용하면 매번 쿼리를 날리지만
@current_user ||=  User.find(session[:id]) 이렇게 하므로서 없을때만  DB에 접속.

2.Dynamic find_by Methods

@tasks = Task.find(:all,:conditions => ['complete = ?',false])
이렇게 쓰는것을 아래 처럼 dynimic_find_by methdod를 이용하여 좀더 의미있게 바꿈
@tasks = Task.find_all_by_complete(false)

3.Find Through Association

htm에서
@project = Project.find(param[:id])
@tasks = Task.find(:all,:conditions => ['project_id =? AND complete = ? ',@project.id,false])
이런식으로 사용되는데 아래와 같이 바꿀수 있음
@tasks = @project.tasks.find_all_by_complete(false);

4.Move Find into Model


Task controller에서
@tasks = Task.find_all_by_complete(false,:order => 'created_at DESC)

이렇게 사용하는데 이것을 Task model의 클래스 매소드를 이용하여
def self.find_incomplete
  find_all_by_complete(false, :order => 'created_at DESC')
end

@tasks = Task.find_incomplete 이렇게 수정할수있고

project controller에서도
@tasks = Task.find_all_by_complete(false,:order => 'created_at DESC)
->@tasks = Task.find_incomplete
이렇게하면 좀더 의미있는 매소드로 만들수 있고 재사용하기 편함.

5.Using with scope(유용)

커스텀된 find메소드에 with_scope을 이용하여 파마메터를 전달하는 방법.

6.Shortcut Blocks with Symbol to_proc

블록사용을 좀더 쉽게하는 방법
find(:all).collect{|p| p.name}
이렇게 사용하는데
find(:all).collect(&:name)이렇게 사용하는거랑 같은 표현.

참고사이트:Railscasts

거의 애자일 레일즈에서 본내용인데 그냥 정리하는 차원에서 정리 좀 해야겠다.
나머지는 낼.

Posted by 전용우