Como puedo hacer varios rescues en una action

Hola como estan!

tengo una duda respecto al manejo de exceptions en rails .

en mi modelo User.rb , tengo un

before_destroy :dont_destroy_admin

def dont_destroy_admin
raise “No podemos eliminar al admin” if self.role == 1
end

y en mi UsersController:

def delete_user
begin
User.find(params[:id]).destroy
flash[:main_notice] = ‘user deleted’
redirect_to :action => ‘index’,:lang=>‘es’
rescue
flash[:main_notice] = ‘cant destroy admin’
redirect_to :action => ‘index’,:lang=>‘es’
end

end

pero si luego intento poner otro before_destroy, no me elimina nada, mi
idea
es hacr que el usuario no se pueda eliminar a el mismo
algo asi como un

before_destroy :dont_destroy_myself

def dont_destroy_myself
raise “No podemos eliminarte a ti mismo” if self.id ==
@current_user.id
end

pero con esto no puedo eliminar a ningun usuario, ni el admin, ni el
current
, ni ningun otro.
en mi controller luego hago dos rescues para tratar de detectarlos ,
pero
seguro que no es asi como se hace:

def delete_user
begin
User.find(params[:id]).destroy
flash[:main_notice] = ‘user deleted’
redirect_to :action => ‘index’,:lang=>‘es’
rescue
flash[:main_notice] = ‘cant destroy admin’
redirect_to :action => ‘index’,:lang=>‘es’
rescue
flash[:main_notice] = ‘cant destroy you’

redirect_to :action => 'index',:lang=>'es'

end

end

agradecería la ayuda de ustedes, muchas gracias de antemano

On Feb 8, 2008 5:20 AM, Miguel M. [email protected]
wrote:

        raise "No podemos eliminar al admin" if self.role == 1
   redirect_to :action => 'index',:lang=>'es'

algo asi como un
pero con esto no puedo eliminar a ningun usuario, ni el admin, ni el current
flash[:main_notice] = ‘cant destroy admin’

simplelogica.net

Puedes capturar el mensaje que utilizas como excepción y utilizarlo en el
flash:

—user.rb—

before_destroy :dont_destroy_admin
before_destroy :dont_destroy_myself

def dont_destroy_admin
raise “No podemos eliminar al admin” if self.role == 1
end
def dont_destroy_myself
raise “No podemos eliminarte a ti mismo” if self.id ==
@current_user.id
end

—EOF—
—users_controller.rb—

def delete_user
User.find(params[:id]).destroy
flash[:main_notice] = ‘user deleted’
redirect_to :action => ‘index’,:lang=>‘es’
rescue => e
flash[:main_notice] = e
redirect_to :action => ‘index’,:lang=>‘es’
end
#…
—EOF—

Creo que con eso conseguirias lo que te propones.

Estais seguros de que esto funciona?

def dont_destroy_myself
raise “No podemos eliminarte a ti mismo” if self.id ==
@current_user.id
end

Un saludo,

Francesc

On Feb 8, 2008, at 9:25 AM, Daniel R. Troitiño wrote:

User.find(params[:id]).destroy
pero si luego intento poner otro before_destroy, no me elimina
end
begin
end

@current_user.id
flash[:main_notice] = e
redirect_to :action => ‘index’,:lang=>‘es’
end
#…
—EOF—

Creo que con eso conseguirias lo que te propones.


Ror-es mailing list
[email protected]
simplelogica.net


Not sent from my iPhone

Hola,

def dont_destroy_myself
raise “No podemos eliminarte a ti mismo” if self.id
http://self.id == @current_user.id
end

Este filtro siempre te va a dar un error. A no ser que hayas cambiado
como funcionan las cosas, la variable @current_user es una variable de
instancia que se crea en el controller. En un callback del modelo, no
puedes usar variables de instancia del controlador. Al pasar por
@current_user.id vas a tener una excepción

Este filtro debería ser un filtro de controller y preguntar en lugar de
por self.id por params[:id]. En ese caso sí debería funcionar, aunque en
ese caso no te sirve el manejo de excepciones en la acción ya que la
excepción la lanzarías antes de que se llamase a la acción. Deberías
poner el mensaje en la variable flash directamente.

saludos,

javier ramírez