2012-02-27 24 views
8

Tengo un controlador con un método como;Al pasar parámetros a CanCan en RoR

def show 

    if params[:format].eql?("pdf") 
    // do something 
    elsif params[:format].eql?("csv") 
    // do something 
    end 
end 

Pero tengo usuarios con diferentes roles. Entonces uso CanCan para administrar el control de acceso. Ahora quiero el rol X puede hacer la acción show en el controlador iff params[:format].eql?("csv")

Creo que puede ser así; can :show, resource if params[:format].eql?("csv"). Entonces, ¿cómo puedo enviar parámetros a ability.rb?

¿Alguna idea?

Gracias.

Respuesta

24

En ApplicationController añadir los siguientes:

# CanCan - pass params in to Ability 
# https://github.com/ryanb/cancan/issues/133 
def current_ability 
    @current_ability ||= Ability.new(current_user, params) 
end 
+0

Esto se debe marcar como respuesta. ¡Gracias! –

+1

Perfecto - excepto sangrías por 4 espacios: D – Hendrik

1

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.

+0

buen ejemplo, Simon, pero no es lo que estoy buscando. Porque solo uso params [: formato] para decidir el comportamiento del método. En su ejemplo, usa params para encontrar un registro. El record pasa a la capacidad de decidir el control de acceso. Pero no estoy usando params en tu camino. –

Cuestiones relacionadas