1

私の新しいプロジェクトでは、他のユーザーが賭けの所有者または彼の友人である場合にのみ読み取ることができるリソース 賭けがあります。主な問題は、インデックス アクションの能力を定義するときに発生します。インデックス アクションでは、ブロックは実行されないので、オプションではないと思います。

それを説明しましょう。所有者だけが賭けをインデックス化できるようにしたい場合は、これで十分です。

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

しかし、許容できる ID は、ユーザーのすべての友人によって定義された範囲である必要があります。何かのようなもの:

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

しかし、これは正しい CanCan 構文ではありません。

多くの人が CanCan とネストされたリソースに問題を抱えていると思いますが、これに対する答えはまだ見当たりません。

4

2 に答える 2

1

Bet モデルで、メソッドを作成します。

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

次に、ability.rb で、CanCan パーミッションを設定します。

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

編集

ご指摘のとおり、インデックス アクションにはオブジェクトのインスタンスがないため、上記のブロックは実行されません。

ただし、あなたがやろうとしていることのように思えます-ユーザーまたはその友人が所有する賭けをリストします-CanCanまたは権限を使用して処理するべきではありません. User モデルに関数を作成します。

def bet_listings
    friend_bets = friends.inject([]){ |bets, friend| bets<<friend.bets; bets }
    self.bets + friend_bets
end

次に、インデックスアクションで: @bets = user.bet_listings

于 2012-07-18T14:13:03.257 に答える
0

今、解決策を見つけましたが、あまり好きではありません。それは、カスタム アクションを作成し、その能力を定義することです。例えば...

コントローラーで:

def index
  authorize! :index_bets, @user
end

能力.rbで:

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

それは機能しますが、私はそれを使用することにあまり気分が良くありません。もっとエレガントなものはありませんか?

于 2012-07-18T14:02:57.050 に答える