2011-03-13 10 views
6

¿Cómo comprobar si existe la entrada friendly_id antes de obtenerla?rails friendly_id y compruebe si existe la entrada

Por ejemplo:

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

Está bien, pero quiero comprobar antes si existe friendly_id, algo así como:

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

Respuesta

5

Rescate de RecordNotFound excepción ==>

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

'find_by_id' volverá instancia o nula. Mientras 'find' or' find_by_id' levantará la excepción – fl00r

+0

gracias, corrigió la respuesta. ¡Copiar pegar siempre causa problemas! –

+0

en cualquier caso, un buen enfoque – fl00r

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

Le sugiero que mover solución de Deepak N modelar como lo hice:

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

Así que ahora buscará sus libros por tanto Identificación y babosa y no lanzar una excepción, al igual que #find_by_id método AR estándar.
Por cierto, de acuerdo con documentation #exists? El método ahora es la forma correcta de verificar la existencia de la grabación.

13

A partir de la versión más reciente de la friendly_id joya, se puede decir:

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

Esto es mucho mejor que la respuesta aceptada. Las excepciones deben ser solo para cosas que no se pueden predecir fácilmente, no cosas que se espera que sucedan. – marksiemers

+0

si usa: buscadores, probablemente pueda omitir los amigos, lo que resulta en 'Book.exists? params [: book_id] ' – AndreiMotinga