2012-11-18 49 views
0

這可能是一個小菜鳥問題,但我總是問。使用CanCan設計

所以我正在構建一個應用程序,讓人們發佈帖子。所以這是一個社交網絡。

但我不希望人們能夠編輯和刪除他人的帖子。

我不認爲基於角色的系統會在這裏工作,因爲人們只管理自己的帖子只有

我在想某種AR關聯,但我不知道這是否可行。

我要的是這樣的事情對我的app/models/ability.rb

class Ability 
    def initialize(user) 
    if current_user.username == @post.username 
     can :edit, Post 
     can :destroy, Post 
    end 
    end 
end 

我怎麼會去這樣做(假設模型UserPost)?

所以基本上我應該做一個User has Posts,或者用戶擁有並且屬於Posts

+0

什麼問題,你實際上有?你嘗試過嗎?另外,你不把用戶關聯到該帖子?爲什麼不'current_user == @ post.user'。或'@ post.owner' –

+0

@IsmaelAbreu問題是我會如何去做,例如'has_many','has_one','has_and_belongs_to_many'。 – weddingcakes

回答

0

問題是類Ability將無法​​訪問@post實例變量。所以我想在Ability.rb你不得不說,用戶can :manage, Post,以便他們可以創建,編輯和銷燬Post對象。然後由您的控制器和模型層來確保他們只能編輯和銷燬他們自己的帖子。

使用CanCan,您可以在控制器頂部撥打load_and_authorize_resource來保護整個事情,但在您的情況下,您的PostsController可能需要在操作級別進行保護。例如,在create,destroy,,editupdate行動中調用authorize! :manage, @post的動作,以及檢查以確保current_user.username == @post.username可以確保人們只能修改他們自己的帖子。

最後,您可能希望用戶改爲「軟刪除」,而不是簡單地將帖子標記爲已刪除。在這種情況下,您將明確授權創建和編輯帖子,但您不會授權他們實際發佈帖子。在您的indexshow操作中,您可以確保標記爲已刪除的帖子未顯示。

對於基於角色的系統,您可能需要一組管理員或添加其他管理員。那時候你會想要一個基於角色的系統。我幾乎總是讓我的角色爲基礎,即使它只是具有adminuser角色。

2

使用此

class Ability 
    def initialize(user) 
    can [:edit, :destroy], Post do |post| 
     post.try(:user) == user 
    end 
    end 
end