2012-02-27 16 views
8

Mam kontroler z metodą podobną;Przekazywanie parametrów do CanCan w RoR

def show 

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

Ale mam użytkowników o różnych rolach. Używam CanCan do zarządzania kontrolą dostępu. Teraz chcę X rola może zrobić akcję show w regulatorze iff params[:format].eql?("csv")

Myślę, że może być podobne; can :show, resource if params[:format].eql?("csv"). Więc jak mogę wysłać parametry do ability.rb?

Każdy pomysł?

Dzięki.

Odpowiedz

24

W ApplicationController dodać następujące:

# 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

ten powinien być oznaczony jako odpowiedź. Dziękuję Ci! –

+1

Doskonały - poza wcięciami 4 spacji: D – Hendrik

1

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.

+0

również ładnym przykładem Simona, ale nie jest to tym, czego szukam. Ponieważ po prostu używam params [: format] do decydowania o zachowaniu metody. W twoim przykładzie używasz params, aby znaleźć rekord. Rekord przechodzi do możliwości decydowania o kontroli dostępu. Ale nie używam params na twojej drodze. –

Powiązane problemy