RoR Validation 맛보기
RoR 4일 완성이라는 40페이지? 정도의 책(무료로 다운 가능합니다.)이 있길래 그 책을 보며 RoR 맛을 보려고 합니다.(일본어랑, 중국어로 된 번역본은 있는데 한글판은 없네요.ㅠ.ㅠ)
흠.. 테이블을 잘 못 만들어서 중복 된 값이 들어가게 되었네요. 테이블을 수정해서 중복된 이름의 category를 못만들게 하면 scaffold로 생성한 뷰에서 에러가 발생합니다.
이런 에러 로그를 보여주는 대신 validation 에러 메시지를 보여주도록 모델에 간단하게 validation 로직을 추가할 수 있습니다.
validates_length_of :category, :within => 1..20
validates_uniqueness_of :category, :message => "already exists"
end
코드가 엄청나게 직관적이기 때문에 어떤 내용인지 짐작할 수 있을 것입니다.
이렇게 코드를 추가해주고 서버를 껐다 다시 돌릴 필요도 없이 그냥 계속 작업을 합니다.
이미 등록되어 있는 Category인 스터디를 입력하면...
흠.. 정말 놀랍도록 간단하고 영리한 프레임워크입니다.
뷰 코드를 보면 제일 상단에 이미 에러 객체의 내용을 출력하는 것으로 보이는 코드가 들어있습니다.
<!--[form:category]-->
<p><label for="category_category">Category</label><br/>
<%= text_field 'category', 'category' %></p>
<p><label for="category_created_on">Created on</label><br/>
<%= datetime_select 'category', 'created_on' %></p>
<p><label for="category_updated_on">Updated on</label><br/>
<%= datetime_select 'category', 'updated_on' %></p>
<!--[eoform:category]-->
그리고 컨트롤러에서 create 메소드를 보겠습니다.
@category = Category.new(params[:category])
if @category.save
flash[:notice] = 'Category was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end
흠.. 이건 좀 모르겠네요. 분명 여기서 Category 모델을 사용자가 폼에서 입력하는 데이터를 바인딩하고(Category.new(params[:category]))나서.. 저장할 때(@category.save) Validation을 걸리게 되고 else문에 걸려서 계속해서 "new" 즉 생성하는 페이지를 다시 로딩 할 때 위에서 봤던 뷰 코드가 다시 읽히게 되고 그 때 에러의 내용을 출력(<%= error_messages_for 'category' %>)해주는 것 같은데. 대체 Dao 역할을 하는 코드(@category.save의 실체)는 어디에 있는거지??