2011-06-08 46 views
2

我一直在關注使用康康斯的Ryan Bates的railscast,但是我很難理解爲什麼檢查一個用戶是否寫了一篇評論,然後讓他們編輯它,如果他們有,就不會爲我工作。如何讓用戶只更新他們使用cancan編寫的評論?

繼承人的代碼,我有:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.role == "admin" 
     can :manage, :all 
    else 
     can :read, :all 
     if user.role == "author" 
     can :create, Review 
     can :update, Review do |review| 
      review.try(:user) == user 
     end 
     end 
    end 
    end 
end 

我希望作者能夠只能夠更新他們寫的評論,所有其他的能力做工精細,但在一分鐘作者可以更新由大家寫評論,我在這裏錯過了什麼?

即時通訊使用的能力,以決定是否要在回顧部分顯示編輯鏈接:

<% if can? :update, Review %> 
    testing 
    <% end %> 

感謝您的幫助!

回答

4

在你看來,你應該寫類似

<% if can? :update, @review %> 
    testing 
<% end %> 

所以通過在實際審查對象,而不是僅僅類。

+1

感謝您的答案,它仍然沒有使用'@review',但使用'審查'確實奏效。 – Dave 2011-06-08 12:33:15

1

嘗試:

review.user_id == user.id 

相反的:

review.try(:user) == user 

你比較同一用戶的兩個不同的實例。這可能是使用user.object_id進行比較。 Rails 3.1通過使用ActiveRecord的標識映射來解決這個問題。

要確認:

user.find(1) == user.find(1) 
0

我會避免使用塊用於該用途的情況下,並使用慘慘的屬性哈希方法代替:

if user.role == "author" 
    can :create, Review 
    can :update, Review, :user_id => user.id 
end 

這將基於用戶ID而不是用戶對象本身進行比較。

相關問題