0

cancan gemでユーザーの能力問題を解決しようとしています。会社とユーザーは、会社に多くのユーザーがいて、ユーザーが多くの会社に属しているように、user_company_assignment を介して関連付けられています。会社の表示アクションを、会社に関連付けられているユーザーのみに制限したいと思います。以下に、2 つのモデルのコードと、initialize ロールの継承と、seller ユーザーのメソッドを含むability.rb の抜粋がありますが、これは機能せず、常に会社の詳細が表示されます。

会社.rb

has_many :user_company_assignments
has_many :user, :through => :user_company_assignments

ユーザー.rb

has_many :user_company_assignments
has_many :companies, :through => :user_company_assignments

アビリティ.rb

def initialize(user)
  @user = user || User.new # for guest
  @user.roles.each { |role| send(role.name.downcase) }
end

def seller
  can :manage, :all
  cannot :destroy, :all

  can :show, Company do |company|
    company.user_ids.include? @user.id
  end
end 
4

3 に答える 3

2

あなたのエラーは能力の優先順位によるものです: https://github.com/ryanb/cancan/wiki/Ability-Precedence

この行は、次のすべての機能をオーバーライドします。can :manage, :all

売り手はすべてを管理できるとすでに述べたので、売り手は他のcan記述に関係なく、会社に対してあらゆる種類のアクションを実行できます。

1 つの解決策は、 で行ったように を使用することcannotです:destroy:manage, :all句をオーバーライドします。

def seller
  can :manage, :all
  cannot :destroy, :all
  cannot :show, Company do |company|
    !company.user_ids.include? @user.id
  end
end
于 2013-02-20T11:34:28.400 に答える
0

OK jesper、私は私のability.rbを変更しました、そしてそれは機能します、しかし私はこれが能力を設定するための最良の方法であるかどうかわかりません、私は売り手がショーアクションへの許可を持っている各モデルを指定する必要があるのは奇妙です。それが最善の方法かどうか教えてください:

Ability.rb

def seller
  can [:index, :create], :all
  cannot :destroy, :all

  can :show, Company do |company|
    company.user_ids.include? @user.id
  end

  can :show, [Report, Client]

end 
于 2013-02-20T11:48:48.050 に答える
0

load_and_authorize_resourceコントローラーでメソッドを呼び出す必要があります。

于 2013-02-20T11:31:28.290 に答える