2011-03-13 1 views
6

friendly_id 항목을 받기 전에 그것을 확인하는 방법?rails friendly_id하고 항목이 존재하는지 확인하십시오.

예를 들어

:

def book 
    @book = Book.find(params[:book_id]) 
    end 

괜찮아,하지만 난 friendly_id이 존재하는 경우, 이전과 같이 확인합니다 : RecordNotFound 예외 ==>에서

def book 
    if Book.exists?(params[:book_id]) 
    @book = Book.find(params[:book_id]) 
    else 
    #404 not found 
    end 

답변

5

구조를

def book 
    @book = Book.find(params[:book_id]) 
    #OK 
rescue ActiveRecord::RecordNotFound => e 
    head :not_found 
end 
+0

'find_by_id'는 인스턴스 또는 전무를 반환합니다. 'find' 또는'find_by_id'가 예외 – fl00r

+0

을 발생시키는 동안, 답을 수정했습니다. 붙여 넣기 복사는 항상 문제로이 끕니다! 어떤 경우 든 –

+0

좋은 접근 – fl00r

-1
@book = Book.find_by_id(params[:book_id]) 
if @book 
    # OK 
else 
    #404 not found 
enв 
1

다음에 제안합니다. 내가했던 것처럼 디팍 N의 솔루션은 모델링 이동 :

def self.find_by_friendly_id(friendly_id) 
    find(friendly_id) 
rescue ActiveRecord::RecordNotFound => e 
    nil 
end 

을 그래서 지금은 모두 ID와 슬러그하여 책을 가져옵니다 그냥 표준 AR 방법 #find_by_id 같은 예외를 발생하지 않습니다.
진술서에 따르면, documentation #exists? 방법은 이제 레코드 존재를 확인하는 올바른 방법입니다!

13

friendly_id 보석의 최신 버전으로, 당신은 말할 수 :

Book.friendly.exists? params[:book_id] 
+2

이것은 허용 된 대답보다 훨씬 낫습니다. 예외는 예상 할 수없는 일에만 사용해야합니다. – marksiemers

+0

당신이 사용하는 경우 : finders 당신은 아마도'Book.exists? params [: book_id]' – AndreiMotinga