Rails exceptions o como controlar permisos a ciertos metodos

Hola a todos,
tengo una tabla grupos con la siguiente estructura:

create_table :groups do |t|

t.integer :user_id

usuario que crea el grupo

t.string :name

t.text :description

t.boolean :allow_member_post_events, :default => true

t.timestamps

end

create_table eventsdo |t|

t.integer :group_id

t.integer :user_id

t.string :name
t.timestamps

end

La idea es que un usuario puede crear un grupo y puede decidir si dejar
o no al resto de usuarios insertar eventos. Mi pregunta es cual es la
mejor manera de controlar esto, me explico, imaginad que no permito
insertar eventos al resto de usuario y uno fuerza la siguiente url

/groups/1/events/new

Lo que quiero es que la aplicación le redireccione a la página principal
y le de un mensaje de que no está autorizado para realizar esa acción
(el usuario que crea el grupo sí podría añadir en este caso)

He leído sobre las Exception Handling
(http://ryandaigle.com/articles/2007/9/24/what-s-new-in-edge-rails-better-exception-handling)
de Rails 2.0 ¿si os ocurre como se podría hacer esto?

Muchas gracias

Creo que la mejor manera que proporciona rails para hacer lo que
necesitas son los before_filter.
Es decir, en el controllador de groups, pones:
before_filter :authorize
y te creas el metodo authorize indicando que si para el grupo
1 :allow_member_post_events es falso redireccionar a donde tu quieras:
def authorize
if Group.find(params[:group_id]).allow_member_post_events!=true
redirect_to a donde tu quieras
end
end

En cualquier caso, los before_filter se suelen usar para cargar algún
dato común a varias acciones, y para hacer de filtro(restringir acceso)
a acciones.
Si vas a necesitar el before_filter en varios controladores, define el
metodo authorize en el controlador de aplicación.
espero que te sirva.
Un saludo.
El mié, 02-04-2008 a las 15:07 +0200, Mario S. escribió:

ah ,before_filter acepta parámetros, de tal manera que puedes indicar
antes de que acciones quieres que se ejecute de dos maneras:
before_filter :authorize, :only => [“create”,“update”]
before_filter :authorize, :except => “new”

El mié, 02-04-2008 a las 17:04 +0200, fernando.martinezgil escribió:

El mié, 02-04-2008 a las 15:07 +0200, Mario S. escribió:

Hola a todos,
Hola

La manera común de hacerlo es un before_filter, pero si es solo para una
acción, lo único que consigues es ensuciar el código.

Yo propondría

class GroupsController …
before_filter :load_grupo, :except => :index

def new
if @group.user != current_user
flash[:error] = “No estas autorizado, coño !”
redirect (a donde quieras)
end
@group = Group.new(params[:group])
end

protected
def load_group
@group = find(params[:id])
end

end

Si quieres hacerlo con excepctiones:


def new
raise Exception if @group.user != current_user

end

Y sigues el tutorial que te has leido para capturar esa excepción.

De todas formas, en tu caso te recomiendo el before_filter por que new y
create comparten restricciones, y salvo que manejes la falta de
diferentes maneras (por ejemplo, en new avisas de que no puede hacerlo,
pero en create registras el error por que se trata de un ataque ya que
es una ruta a la que el usuario normal no debería tener acceso).

He leído sobre las Exception Handling
(http://ryandaigle.com/articles/2007/9/24/what-s-new-in-edge-rails-better-exception-handling)
de Rails 2.0 ¿si os ocurre como se podría hacer esto?

Muchas gracias
De nada.


Guillermo [email protected]