2010-02-25 10 views
33

Un usuario sólo puede editar su propio puesto, así que usar lo siguiente para comprobar si un usuario puede entrar en el formulario de edición:rescate de ActiveRecord :: RecordNotFound en Rails

def edit 
    @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]}) 
    rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
    end 

Pero no está trabajando, cualquier ideas lo que estoy haciendo mal?

Respuesta

52

Si desea utilizar la instrucción de rescate es necesario utilizar find() de manera que plantea excepciones, es decir, pasando el ID que desea encontrar.

def edit 
    @post = Load.scoped_by_user_id(session[:user_id]).find(params[:id]) 
rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
end 
+0

Gracias @ Simone Carletti eso es todo. – Adnan

6

Resulta que estaba utilizando rescue y find (: first) incorrectamente.

encontrar: primero devuelve nil si ningún registro coincide con las condiciones. No aumenta ActiveRecord :: RecordNotFound

tratar

def edit 
    @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]}) 
    if @post.nil? 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
    end 
end 
+0

que estoy recibiendo "Llamado Identificación de cero, lo que erróneamente ser de 4 - si realmente quería el id de cero, utilice object_id" – Adnan

+1

Estaba utilizando rescate mal, pero el verdadero problema es que la hallan: primero devuelve nil si no se encuentra ningún registro. Solución actualizada para abordar la verdadera raíz de su problema. – EmFi

+0

@DemitryT: Mientras que su código produciría el mismo resultado. En este caso, elegí escribirlo de esta manera para abordar explícitamente el error en la pregunta original. También como una cuestión de preferencia, no me gusta usar una declaración de asignación como una condición. Encuentro que la combinación es más difícil de mantener y depurar. – EmFi

34

También puede utilizar el método rescue_fromActionController 's. Para hacerlo para toda la aplicación a la vez!

class ApplicationController < ActionController::Base 
    rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found 

    def record_not_found 
    render 'record_not_found' # Assuming you have a template named 'record_not_found' 
    end 
end 
+0

¿Por qué necesito el 'verdadero' al final? Además, ¿qué me gustaría incluir insted of '# ...'? –

+0

@AlexPopov Buena pregunta, no puedo recordar por qué la he publicado así. No creo que lo necesite ... –

+1

También 'render 'record_not_found'' implica que debe tener esa plantilla. Alternativamente, podría usar 'render text: 'Some descriptive message''. –

Cuestiones relacionadas