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)
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
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”
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).