2011-09-22 3 views
0

내 컨트롤러에서 ajax POST delete를 실행하면 이미 삭제 된 레코드에 대해 레일즈에서 "정의되지 않은 메서드`destroy '가 nil : NilClass"라는 오류를 발생시킵니다. 그런데 왜 나는 destory 호출 이전의 find_follow 메소드에서 응답을 렌더링하려 할 때 여전히 그렇게 말하는가? find_follow 내에서 실행을 중단하면 안됩니까?개인 메서드에서 false를 반환 한 후 내 레일 컨트롤러가 실행을 멈추지 않는 이유는 무엇입니까?

class FollowsController < ApplicationController 


def find_follow 
    begin 
    @follow = current_artist.follows.find(params[:id]) 
    raise "Record Not Found" if @follow.nil? 
    rescue => e 
     respond_to do |format| 
     format.html { redirect_to(artist_follows_path(current_artist),:notice => "#{e}") } 
     format.js { render :text => "#{e}", :status => :not_found} 
     format.json {render :json => "#{e}", :status => 400} 
     end 
     return false 
    end 
    end 


    def destroy 
    find_follow 
    if (@follow.destroy) 
     # respond_to html, js, json... 

    end 

    end 
end 

답변

1

귀하의 find_follow 반환 전무 괜찮습니다하지만 당신은 destroy 메소드를 호출하는으로 만

또한 다음과 같이 before_filter 뭔가를 사용할 수 있습니다

def destroy 
    return find_follow 

을 시도 destroy 방법 수익을 작성해야

class FollowsController < ApplicationController 
before_filter :find_follow, :only=>[:destroy] 

def find_follow 
    @follow = current_artist.follows.find_by_id(params[:id]) 
    if @follow.nil? 
     redirect_to(artist_follows_path(current_artist),:notice => "#{e}") 
    else 
     return true 
    end 
    end 


    def destroy 
    if (@follow.destroy) 
     # respond_to html, js, json... 

    end 

    end 
end 
+0

이는 개인용 메소드에서 컨트롤러 실행을 중지 할 수 없음을 의미합니다. 파괴 방법에 대해서만? 레코드를 찾을 수 없을 때마다 find_follow 메소드가 실행을 중지하도록하여 컨트롤러를 DRY하려고했습니다. – Homan

+0

제 편집 된 답변을 확인하십시오. 'find_by_id'를 쓰지 않습니다. Record Not Found – Salil

+0

before 필터를 사용하면 제안대로 작동합니다. 그러나 나는 이것이 왜 효과가 있는지 확신하지 못한다. destroy 메소드와 별도의 메소드를 호출하는 것이 before_filter를 갖는 것과 같을 것이라고 생각했지만 분명히 ... – Homan