Cancan并不总是显示授权链接

时间:2010-12-05 00:58:13

标签: ruby-on-rails authentication cancan

我正在使用Cancan来控制User能力,并且最近遇到了一个奇怪的问题:我的部分有一个“破坏”超链接,有时仅出现给授权用户。当我刷新页面时,无法确定链接是否存在。

我已通过以下方式在Event中为Ability.rb模型定义了功能:

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

我使用regattas(true)来防止系统使用缓存的关联,以防最近发生了某些变化。

在我的rspec测试中,这对于当前用户来说非常有用,无论是在我的Ability.rb测试还是我的EventsController测试中。

这是毁灭。销毁我的_event.html.erb部分中的超链接,我只想在用户具有销毁event的能力时出现:

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

有关如何修复闪烁的任何建议,并获得ALWAYS的“销毁”链接出现给授权用户?还有其他人遇到过这个问题吗?

更多背景:我没有这个问题的另一段代码,而不是部分代码,如下所示:

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

谢谢,所有。

1 个答案:

答案 0 :(得分:0)

Ryan Bates在cancan github issue上实际上为我回答了这个问题。看起来Cancan对使用default_scope的模型存在已知问题,记录为on this ticket。在我的情况下,event.rb包含了对default_scope的调用。把这条线完全解决了这个问题。

关于the second ticket的讨论表明这是Ruby on Rails的问题,正如本lighthouse ticket中所讨论的那样。

希望这可以帮助其他人解决这个奇怪的问题!谢谢,Ryan ......如果您碰巧在此发帖,我会把答案交给您。