2013-02-26 3 views
4

저는 조상을 사용하여 레일스에 계층 카테고리를 구축하고 있습니다. 사용자가 생성중인 객체의 부모를 선택할 수 있도록 허용합니다. 드롭 다운을 사용하여 기존 범주를 표시합니다.nil 부모가있는 조상의 레일

<%= f.input :ancestry, collection: Category.sorted_list %> 

사용자가 기존 노드를 선택하면 모든 항목이 정상적으로 작동합니다. 사용자가 드롭 다운에서 빈 칸을 선택하면, Ancestry가 루트 노드를 만들 것이라고 기대하지만 폼 대신 "is invalid"오류가 발생합니다.

내 컨트롤러는 mindblowing하고 아무것도되지 않습니다

def update 
    @category = Category.find(params[:id]) 

    respond_to do |format| 
    if @category.update_attributes(params[:category])   
     format.html { redirect_to @category, notice: 'Category was successfully updated.' }   
     format.json { head :no_content } 
    else   
     format.html { render action: "edit" } 
     format.json { render json: @category.errors, status: :unprocessable_entity } 
    end  
    end 
end 

내가 레일에 새로운 해요, 그래서이 문제를 공격하는 방법을 모르겠어요. 내가 놓친 Ancestry에 대한 구성이 있습니까? 아니면이 양식 유효성 검사기가 아마도 과도한 보호 기능을 수행하고 있습니까?

답변

6

ancestrynil이 아니므로 모든 보석의 동작이이 속성을 기반으로하기 때문에 수동으로 변경하는 것은 좋지 않습니다. 이러한 경우 gem에는 양식에 사용해야하는 다른 parent_id 속성이 있습니다.

# Validate format of ancestry column value 
validates_format_of ancestry_column, :with => Ancestry::ANCESTRY_PATTERN, :allow_nil => true 

하지만 당신은 nil 값을 전달할 수 없습니다

ancestry는 희망이 도움이 사용하는 형태를 구축하는 방법을 gem's wiki에 좋은 설명이 있습니다

+0

어쩌면 나는 정확하게 카테고리 모델을 올바르게 설정하는 방법을 모르겠다. 내 양식에 a : parent_id select를 추가하면 컨트롤러에서 "보호 된 속성을 대량 할당 할 수 없습니다 : parent_id"오류가 발생합니다. 가계도와 parent_id 열을 모두 가지고 있어야합니까? –

+1

데이터베이스에'parent_id'가 있어야 할 필요는 없습니다. 단지'ancestry' 컬럼뿐입니다. 하지만 대량 할당 오류를 피하기 위해서는'attr_accessible'에'parent_id'를 써야합니다. –

+0

그게, 고마워요! –

1

조상은 this으로 자신의 분야의 유효성을 확인 형태로. 그래서 나는 이것을했다 :

before_validation do 
    self.ancestry = nil if self.ancestry.blank? 
end