通过不显示所有记录可以访问Cancan

时间:2012-08-03 10:17:35

标签: ruby-on-rails ruby-on-rails-3 cancan

那里没有人可以帮助解决这个问题吗?

在我的rails 3.2应用程序中使用cancan查找记录时遇到问题。

在我的'nas'索引中,我正在尝试显示属于current_user位置的'nas'列表。

问题似乎是用户和鼻子之间没有正式关系 - 该位置拥有nas并且用户拥有该位置。

在我的nas控制器中使用accessible_by方法给了我不寻常的结果。如果我在ability.rb中使用以下内容,则会收到错误:

 can :read, Nas, :locationusers => { :user_id => user.id }

 Error: undefined method `class_name' for nil:NilClass

而且,如果我改为:

 can :read, Nas, :locations => { :user_id => user.id }

我只为用户的第一个位置列出了nas。

例如,如果我的用户的位置为ids = 1,2,3,则仅显示位置1的nas。

有没有办法使用cancan显示当前用户位置的所有nas,或者我必须以不同的方式进行此操作吗?

我的关系如下:

 class User < ActiveRecord::Base
   ...
   has_many :locationusers
   has_many :locations, :through => :locationusers
   ...
 end


class Location < ActiveRecord::Base
  ...
  has_many :locationusers
  has_many :users, :through => :locationusers

  has_many :nas
  ...
end   

class Node < ActiveRecord::Base
  ...
  belongs_to :location
end

在我的能力.rb:

...
if user.role? :customer_admins
can :read, Nas, :locations => { :user_id => user.id }
..

NasController

 @nas = Nas.accessible_by(current_ability).all

1 个答案:

答案 0 :(得分:1)

使用康康,用户为王。如果您无法从用户到您尝试授权的模型中绘制一条线,则无法使用。简单的解决方案是模拟Nas(示例中的模型称为Node?)和User之间的关系。这可以通过Locationuser(在您的示例中未显示)作为has_many来完成:通过使用现有的belongs_to。

class Node < ActiveRecord::Base
  ...
  belongs_to :location
  has_many :locationusers, :through => :location
end

现在在您的Cancan ability.rb中,您可以使用:

can :read, Node, :locationusers => { :user_id => user.id }

(我将Nas从您的示例更改为Node以正确匹配模型)