2012-11-24 3 views
1

Je travaille sur une application de sondage et utilise Devise et Cancan pour l'authentification et l'autorisation. J'ai un modèle d'utilisateur généré par Devise et un modèle de sondage. Un sondage appartient à un utilisateur. Mon problème est que j'ai une action personnalisée dans mon contrôleur Polls et je n'arrive pas à faire fonctionner Cancan avec cette action personnalisée. Voilà ce que j'ai essayé de faire dans mon code:Application de cancan à des actions personnalisées

config/routes.rb:

match 'users/:user_id/polls' => 'polls#show_user' 

Ability.rb:

def initialize(user) 
    user ||= User.new 

    if user.is? :admin 
    can :manage, :all 
    else # default 
    can :read, :all 
    can :manage, Poll, :user_id => user.id 
    can :show_user, Poll, :user_id => user.id 
    end # if else admin 
end 

polls_controller.rb:

class PollsController < ApplicationController 
    before_filter :authenticate_user! 
    load_and_authorize_resource :except => :show_user 

    def show_user 
    authorize! :show_user, user 
    @polls = Poll.find_all_by_user_id(params[:user_id]) 
    render "index" 
    end 
    <...> 
end 

L'idée est que les sondages d'un utilisateur peuvent être consultés uniquement lorsque le propriétaire du sondage est connecté. Cependant, avec ce code, lorsque le propriétaire d'un sondage est signé ed in, cet utilisateur est expulsé de cette page avec un message indiquant que l'autorisation a échoué. Si je supprime la ligne authorize! :show_user, user, un utilisateur connecté peut voir tous les sondages des autres utilisateurs (l'autorisation ne fonctionne pas du tout).

Quelqu'un peut-il voir ce que je pourrais manquer? Merci d'avance!

Répondre

2

En abiltity.rb, vous êtes verbe/nom combinaison est :show_user et Poll, mais dans votre contrôleur que vous utilisez :show_user et user --vous aurait besoin d'utiliser un Poll à la place.

Si, au lieu que vous souhaitez permettre à l'utilisateur de visualiser tous leurs propres Poll s, vous pouvez aller avec quelque chose comme:

ability.rb:

can :show_polls_for, User, :id => user.id 

polls_controller.rb:

def show_user 
    authorize! :show_polls_for, user 
    ... 
end 
+0

Votre suggestion a fonctionné, merci! – jules

Questions connexes