2010-12-05 26 views
0

J'utilise Cancan pour contrôler User capacités, et j'ai récemment rencontré un problème étrange: mon lien partiel a un lien hypertexte "détruire" qui apparaît seulement parfois pour les utilisateurs autorisés. Lorsque je rafraîchis la page, il n'y a pas de savoir si le lien existera ou non.Cancan ne montre pas toujours le lien autorisé

J'ai des capacités pour mon modèle défini à EventAbility.rb de la manière suivante:

can [:create, :update, :destroy], Event do |event| 
    user.regattas(true).include?(event.regatta) 
end 

J'utilise regattas(true) pour empêcher le système d'utiliser les associations mises en cache, dans le cas où quelque chose a changé récemment.

Dans mes tests rspec, cela fonctionne très bien pour l'utilisateur actuel, à la fois dans mes tests pour Ability.rb et mes tests EventsController.

Voici la destruction. détruire lien hypertexte dans mon _event.html.erb partielle, que je veux seulement apparaître lorsque l'utilisateur a la capacité de détruire event:

<% if can? :destroy, event %> 
    <td><%= link_to 'Destroy', event, :confirm => 'Are you sure?', :method => :delete %></td> 
<% end %> 

Des conseils pour savoir comment fixer le vacillement et obtenir le lien « Destroy » pour montrer toujours pour utilisateurs autorisés? Est-ce que quelqu'un d'autre a rencontré ce problème?

Plus fond: Je n'ai pas cette question pour un autre morceau de code, et non dans une partielle, ici:

<% if can? :update, @regatta %> 
    <%= link_to 'Edit Regatta Info', edit_regatta_path(@regatta) %> | 
<% end %> 

Merci, tout.

Répondre

0

Ryan Bates a effectivement répondu à celui-ci pour moi, sur ce cancan github issue. On dirait que Cancan a un problème connu avec les modèles utilisant default_scope, documenté on this ticket. Dans mon cas, event.rb inclus un appel à default_scope. Prendre cette ligne complètement résolu le problème. La discussion sur the second ticket a indiqué que c'était un problème avec Ruby on Rails, comme discuté dans ce lighthouse ticket.

Espérons que cela aide quelqu'un d'autre avec ce problème étrange! Merci, Ryan ... Je vais passer la réponse à vous, s'il vous arrive de poster à ce sujet.