修改rails datagrid Gem中的@ grid.assets

时间:2014-08-08 03:10:29

标签: ruby-on-rails ruby datagrid scope

我有一个非常精细的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

在视图级别,它的工作原理(部分复制)。 但是,最好在控制器级别应用限制。

1 个答案:

答案 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