有条件的CanCanCan能力

时间:2018-11-12 17:43:03

标签: ruby-on-rails ruby cancancan

我有一个具有许多ClientApplications的ClientServer。我希望用户只能销毁与他们关联的服务器。每个ClientApplication对象都有一个与current_user匹配的application_owner_email。如果电子邮件匹配,则它们应该具有关联服务器的销毁权限。 在abilities.rb中,我有以下内容

if user.has_role?(:application_owner)
 can :destroy, ClientServer.all.each do |server|
  server.client_applications.each do |app|
   app.application_owner_email == user.email
  end
end

但这不起作用。我已经设置了类似的条件。例如,以下条件可以正常工作:

can :destroy, ClientApplication.all.each do |app|
  app.application_owner_email == user.email
end

用户只能销毁属于application_owner的ClientApplications。

任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

Enumerable#each返回对象self,您可能想要.all?.any?

can :destroy, ClientServer do |server|
  server.client_applications.all?{|app| app.application_owner_email == user.email }
end

请注意,all?对于空数组返回true

还请注意,带有格挡的异能不能产生作用域,并且通常较慢。