我有一个非常精细的ACL。我无法扩展Grid类以使用我的模块,因此我认为我在控制器级别强加了ACL(访问列表)。
基本上在sales_reports_controller.rb我有
@grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope|
scope.page(params[:page])
end
我只需要显示属于具有特定角色的用户的销售额。访问列表在一个数组中,如果我可以浏览@grid.assets
,那么我只能将记录添加到我需要的@grid
并将其传递给视图。
或者,当我获得scope
并过滤记录时,我是否可以进行循环。
无论如何我现在可以做这样或类似的事情:
aa = @grid.assets
grid = []
aa.each do |a|
if user_acls.include?(a.access_list_id)
grid.push a
end
end
@grid.assets = grid
上述循环不起作用,因为资产不会接受任何东西。我收到以下错误。
undefined method 'assets=' for #<SalesReportsGrid:0x007fe9e79203a0>
所以我最好的选择是在这里添加循环
@grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope|
scope.page(params[:page])
end
我不确定如何。
感谢。
编辑:(可能的解决方案) 我添加了
a = []
assets.each do |asset|
if user_acls.include?(asset.access_list_id)
a.push asset
end
end
assets = a
在视图级别,它的工作原理(部分复制)。 但是,最好在控制器级别应用限制。
答案 0 :(得分:2)
您无需将资产传回网格。
在您的控制器中执行以下操作:
@assets = @grid.assets.select do |a|
user_acls.include?(asset.access_list_id)
end.page(params[:page])
在模板引擎中以下列方式呈现资源:
datagrid_table(@grid, @assets)
通常,在ruby级别过滤ACL会导致严重的性能问题。如果您确定@grid.assets
永远不会超过1000,则只能使用它。
如果您能够将其移至SQL - 请执行以下操作:
@grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope|
scope.where(access_list_id: user_acls).page(params[:page])
end