RoR 4일 완성이라는 40페이지? 정도의 책(무료로 다운 가능합니다.)이 있길래 그 책을 보며 RoR 맛을 보려고 합니다.(일본어랑, 중국어로 된 번역본은 있는데 한글판은 없네요.ㅠ.ㅠ)

흠.. 테이블을 잘 못 만들어서 중복 된 값이 들어가게 되었네요. 테이블을 수정해서 중복된 이름의 category를 못만들게 하면 scaffold로 생성한 뷰에서 에러가 발생합니다.

이런 에러 로그를 보여주는 대신 validation 에러 메시지를 보여주도록 모델에 간단하게 validation 로직을 추가할 수 있습니다.

class Category < ActiveRecord::Base
  validates_length_of :category, :within => 1..20
  validates_uniqueness_of :category, :message => "already exists"
end

코드가 엄청나게 직관적이기 때문에 어떤 내용인지 짐작할 수 있을 것입니다.

이렇게 코드를 추가해주고 서버를 껐다 다시 돌릴 필요도 없이 그냥 계속 작업을 합니다.
사용자 삽입 이미지이미 등록되어 있는 Category인 스터디를 입력하면...

사용자 삽입 이미지흠.. 정말 놀랍도록 간단하고 영리한 프레임워크입니다.

뷰 코드를 보면 제일 상단에 이미 에러 객체의 내용을 출력하는 것으로 보이는 코드가 들어있습니다.

<%= error_messages_for '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 메소드를 보겠습니다.

  def 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의 실체)는 어디에 있는거지??