cancancan auth在视图中

时间:2018-04-04 08:04:28

标签: ruby-on-rails cancan cancancan

我将cancancan添加到我的应用程序进行授权,我可以跨越障碍。

我有一个投票系统,你不能在自己的参赛作品上投票,但你可以编辑,删除等。

所以我在能力类中创建了一个块。

def initialize(user)
  if user.present?
    if user.admin?
      can :manage, :all

    else
      can :vote, Entry do |entry|
        user.id != entry.user_id
      end
      can :manage, Entry, user_id: user.id
      can :manage, Message, user_id: user.id
      can :manage, Profile, user_id: user.id
      can :manage, User, user_id: user.id

    end

   can :read, :all

  end
 end

这里是我可以调用的地方吗?方法:

<% @entries.each do |x| %>

 <% if can? :vote, x %>
  <span class="text-green"> <%= link_to like_entry_path(x), method: :put, remote: true do %>
    <i class="fas fa-chevron-up"></i>
  <% end %>
  </span>
  <span class="badge" id="upvote-count<%=x.id%>"><%= x.get_upvotes.size%></span>
  <span class="text-red"> <%= link_to unlike_entry_path(x), method: :put, remote: true do %>
    <i class="fas fa-chevron-down"></i>
  <% end %>
  </span>
  <span class="badge" id="downvote-count<%=x.id%>"><%= x.get_downvotes.size%></span>
 <% else %>
  <i class="fas fa-chevron-up text-grey"></i>
  <span class="badge"><%= x.get_upvotes.size%></span>
  <i class="fas fa-chevron-down text-grey"></i>
  <span class="badge"><%= x.get_downvotes.size%></span>
 <% end %>
<% end %>

但它还不打印链接吗?

调试时,在第一个条目上我检查user.id != entry.user_id并且它返回为假,所以我可以对它进行投票,但在第二个循环中,相同的查询返回真实它应该做但链接仍然出现在视图中?

总结一下,如果这有点令人困惑,两个不同的帐户有两个条目,但两个条目上都有投票链接。

1 个答案:

答案 0 :(得分:1)

定义这样的能力:

cannot :vote, Entry if  user_id: user.id 

Doc:Defining-Abilities-with-Blocks#only-for-object-attributes