can
toma dos argumentos: primero es un tipo de acción que el usuario está tratando de realizar en un recurso, segundo es el recurso (puede ser nombre de clase o variable de instancia) en sí . Si ha configurado correctamente su destreza, usted debería ser capaz de hacer algo como esto:
def show
if params[:format].eql?("pdf")
// do something
elsif params[:format].eql?("csv")
if can? :read, resource
#do stuff
end
end
end
no se olvide que usted tiene que tener su usuario autenticado antes de ejecutar cualquier control Cancan. can?
método solo devuelve verdadero o falso. Normalmente me gusta usar el método authorize!
para verificar habilidades. A diferencia de can
, se levantaría CanCan::AccessDenied
error que puede rescatar y procesar correctamente. Algo en las líneas de:
#models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role? :admin
can :manage, :all
elsif user.role? :hiring_manager
can [:read, :update], Post, user_id: user.id
end
end
end
#controllers/posts_controller.rb
class PostsController < ApplicationController::Base
before_filter :authenticate_user
def show
@post = Post.find(params[:id])
authorize! :read, @post # will thorow an exception if not allowed
end
end
Luego, acabo de detectar la excepción en el nivel ApplicationController.
Esto se debe marcar como respuesta. ¡Gracias! –
Perfecto - excepto sangrías por 4 espacios: D – Hendrik