那里没有人可以帮助解决这个问题吗?
在我的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
答案 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
以正确匹配模型)