2012-10-21 2 views
4

나는 내가 링크를 클릭하면레일 - 새로운 카테고리를 (ID와 범주를 찾을 수 없습니다)

def new 
    respond_to do |format| 
     format.html { new_or_edit } 
     format.js { 
     @category = Category.new 
     } 
    end 
end 

가 호출되는 알고 응용 프로그램을 만듭니다.

이로 인해 new_or_edit이 호출됩니다 (동일한 파일에서 정의 됨).

def new_or_edit 
    @categories = Category.find(:all) 
    @category = Category.find(params[:id]) 
    @category.attributes = params[:category] 
    if request.post? 
     respond_to do |format| 
     format.html { save_category } 
     format.js do 
      @category.save 
      @article = Article.new 
      @article.categories << @category 
      return render(:partial => 'admin/content/categories') 
     end 
     end 
     return 
    end 
    render 'new' 
    end 

는 몇 가지 테스트 후, 나는 "는 ID없이 카테고리를 찾을 수 없습니다"각 실행 오류가있는

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

에서 정지 것을 찾을 수 있습니다. Params는 그것을 인쇄 할 때 : id 해쉬를 가지고 있지 않습니다. 기본 : id 필드가 생성되기 전에 데이터베이스에 저장해야하기 때문입니다.

+0

링크와 함께보기 코드를 추가하십시오. 링크에 "id"를 포함시키지 않았을 가능성이 큽니다. –

+0

이 코드 "format.html {new_or_edit, : id => params [: id]}"및 Category.find (: id)를 사용해 보셨습니까? – stackoverflowery

+0

동일한 작업 내에서 새 작업, 편집 및 업데이트를 처리하려고합니다. 규칙에 따라 객체를 인스턴스화하기 때문에 새로운 액션의 라우팅에는 id 매개 변수가 포함되지 않습니다. 편집 및 업데이트 작업은 기존 레코드를 편집/업데이트하기 때문에 id 매개 변수를 사용합니다. 별도의 새 작업, 편집 작업 및 업데이트 작업을 설정해야합니다. – James

답변

3

당신이 잘못하고있는 것은 두 가지 본질적으로 다른 동작 인 새로운 내용과 수정 내용을 통합하려는 것입니다.

params는 클라이언트에서 가져온 매개 변수의 해시입니다.

새 개체를 만들 때 새로 만든 개체의 id 특성은 클라이언트가 아닌 서버의 책임이므로 params[:id]은 비워 둡니다.

기존 개체를 편집 할 때 개체가 이미 데이터베이스에 있고 ID가 있으므로 개체가 params[:id]이 비어 있지 않습니다. params[:id]의 의미는 "이 속성을 사용하여 id 매개 변수가 [id] 인 객체를 편집하십시오"입니다. params[:id]이 비어 있으므로

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

실패 : 당신이 새로운 목적이 선을 만들 때,이 설명 후

.

+0

정보를 제공해 주셔서 감사합니다. – Jonathan

관련 문제