1

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

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

在我的“nas”索引中,我试图显示属于 current_user 位置的“nas”列表。

问题似乎是用户和 nas 之间没有正式的关系——位置拥有 nas,用户拥有位置。

在我的 nas 控制器中使用 access_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 }
..

纳斯控制器

 @nas = Nas.accessible_by(current_ability).all
4

1 回答 1

1

使用 Cancan,用户为王。如果您无法从 User 到您尝试授权的 Model 画一条线,则它将无法正常工作。简单的解决方案是对Nas(您的示例中的模型称为Node?)和User. 这可以通过Locationuser(在您的示例中未显示)作为 has_many 来完成:通过使用现有的 belongs_to。

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

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

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

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

于 2012-08-07T16:08:14.463 回答