2011-09-22 24 views
0

當我在我的跟隨控制器上運行ajax POST delete時,對於已經被刪除的記錄,rails會在「nil:NilClass」引發錯誤「未定義方法destroy」。但爲什麼它仍然會說,當我嘗試在destory調用之前的find_follow方法中呈現響應時?執行不應該停止在find_follow裏面嗎?爲什麼在我私有方法返回false後,我的rails控制器不會停止執行?

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返回nil這是好的,但因爲你調用destroy方法,你需要寫在destroy方法只返回

嘗試

def destroy 
    return find_follow 

您還可以使用before_filter類似以下

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方法在無法找到記錄時停止執行來幹起我的控制器。 – Homan

+0

檢查我編輯的答案,我使用'find_by_id',因爲它沒有拋出記錄未找到 – Salil

+0

使用之前的過濾器工作正如你所建議的。但是,我不確定這是爲什麼這是有效的?我認爲從destroy方法調用單獨的方法與使用before_filter相同,但顯然不是。 – Homan

相關問題