can
przyjmuje dwa argumenty: Pierwszym z nich jest rodzaj działań, które użytkownik próbuje wykonać na zasobie, drugi zasób (może być nazwa klasy lub zmiennej instancji) się . Jeśli Twoja zdolność ustawione prawidłowo, powinieneś być w stanie zrobić coś takiego:
def show
if params[:format].eql?("pdf")
// do something
elsif params[:format].eql?("csv")
if can? :read, resource
#do stuff
end
end
end
nie należy zapominać, że trzeba mieć swoją uwierzytelnieniu użytkownika przed uruchomieniem jakichkolwiek CanCan kontrole. can?
metoda zwraca tylko wartość true lub false. Zwykle lubię korzystać z metody authorize!
, aby sprawdzić umiejętności. W przeciwieństwie do can
, powstałby błąd CanCan::AccessDenied
, który można uratować i przetworzyć z wdziękiem. Coś w linii:
#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
Następnie, po prostu złapać wyjątek na poziomie ApplicationController.
ten powinien być oznaczony jako odpowiedź. Dziękuję Ci! –
Doskonały - poza wcięciami 4 spacji: D – Hendrik