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 %>

Любые советы о том, как исправить мерцание и сделать так, чтобы ссылка «Уничтожить» ВСЕГДА отображалась для авторизованных пользователей? Кто-нибудь еще сталкивался с этой проблемой?

Дополнительная информация: у меня нет этой проблемы для другого фрагмента кода, а не частичного, показанного здесь:

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

Спасибо всем.


person Sam Ritchie    schedule 05.12.2010    source источник


Ответы (1)


Райан Бейтс на самом деле ответил мне на этот вопрос по cancan github issue. Похоже, у Cancan есть известная проблема с моделями, использующими default_scope, описанная в этой заявке. В моем случае event.rb включал вызов default_scope. Удаление этой строки полностью устранило проблему.

Обсуждение второго тикета показало, что это проблема с Ruby on Rails, как описано в этом билете маяка.

Надеюсь, это поможет кому-нибудь еще с этой странной проблемой! Спасибо, Райан... Я передам тебе ответ, если ты напишешь об этом.

person Sam Ritchie    schedule 06.12.2010