我正在使用cancan,我在UserTransactionsController中有这个
class UserTransactionsController < ApplicationController
load_and_authorize_resource
def index
@company = Company.find(params[:company_id]
@user_transactions = @company.user_transactions.order("date DESC").all
...
在ability.rb中我有:
can [:read], UserTransaction do |ut|
ut.company_user.user.id == user.id
end
ut.company_user.user.id == user.id这行似乎永远不会被击中。它始终显示所有用户事务,也显示其他用户事务。
答案 0 :(得分:1)
@rept,当你使用load_and_authorize_resource方法时,你不需要创建@user_transactions变量,这就是该方法基于ability.rb文件所做的事情。
您正在重写load_and_authorize_resource使用以下行创建的@user_transactions:
@user_transactions = @company.user_transactions.order("date DESC").all
如果您需要获取属于您正在获取的特定公司的用户事务,您可以使用cancanby提供的accessible_by范围:
@user_transactions = @company.user_transactions.accessible_by(current_ability).order("date DESC").all
这应该有帮助,如果你现在还没弄明白,你可以在这里阅读更多关于这个主题的康康文档:https://github.com/ryanb/cancan/wiki/Fetching-Records
答案 1 :(得分:0)
如果您有类似......
can :manage, UserTransaction
或
can :manage, :all
前
can [:read], UserTransaction {|ut| ut.company_user.user.id == user.id}
您将能够阅读所有交易,因为“manage”比“read”
更强