Канкан не всегда показывает авторизованную ссылку - PullRequest
0 голосов
/ 05 декабря 2010

Я использую Cancan для управления способностями User, и недавно у меня возникла странная проблема: у моей части есть гиперссылка "destroy", которая иногда появляется только для авторизованных пользователей.Когда я обновляю страницу, неясно, будет ли ссылка существовать или нет.

Я определил способности для моей 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 %>

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

1 Ответ

0 голосов
/ 07 декабря 2010

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

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

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

...