2012-07-18 107 views
1

在我的新項目中,我有一個資源賭注,其他用戶只有在賭注的所有者或他的朋友時才能閱讀。主要問題出現在我想定義索引操作的能力時。在索引操作中,塊不會被執行,所以我想這不是一個選項。CanCan,嵌套資源和使用方法

讓我們來說明一下。如果我想只有所有者才能夠索引的賭注,這將是不夠的:

can :read, Bet, :user => { :id => user.id } 

但我需要在可接受的IDS是一個範圍,一個用戶的所有朋友定義。類似於:

if (bet.user == user) || (bet.user.friends.include? user) 
    can :read, Bet 
end 

但這是不正確的CanCan語法。

我想很多人都遇到過CanCan和嵌套資源的問題,但我仍然沒有看到任何答案。

回答

0

剛纔我找到了解決方案,但我不太喜歡它。這是關於創建自定義操作併爲其定義功能。例如...

在控制器:

def index 
    authorize! :index_bets, @user 
end 

在ability.rb:

can :index_bets, User do |friend| 
    user == friend || user.friends.include?(friend) 
end 

它的工作原理,但我不覺得了不起使用它。沒有更優雅的東西嗎?

1

在您的投注模型,創建一個方法:

def is_accessible_by? (user) 
    owner = self.user 
    owner == user || owner.friends.include?(user) 
end 

現在ability.rb,設置您的康康舞權限:

can :read, Bet { |bet| bet.is_accessible_by?(user) } 

編輯

正如你指出的,由於索引操作沒有對象的實例,所以上面的塊不會被執行。

但是,這聽起來像你正在嘗試做的事情 - 列出用戶或他們的朋友擁有的投注 - 不應該使用CanCan或權限處理。我會在我的用戶模型創建一個函數:

def bet_listings 
    friend_bets = friends.inject([]){ |bets, friend| bets<<friend.bets; bets } 
    self.bets + friend_bets 
end 
索引中的作用

然後: @bets = user.bet_listings

+0

它不工作。能力塊中的條件不用於像索引這樣的動作。 – Gawyn 2012-07-18 14:23:58

+0

你是對的,我沒有仔細閱讀你的問題:( 我會再給你一個建議...... – 2012-07-18 14:43:27