如何在控制器中设置变量,在其他 class 中可用?

How to make a variable set in controller, available in other class?

在我的控制器中我有:

  def index
    @grid = UsersGrid.new(params[:users_grid]) do |scope|
      scope.where(admin: false).page(params[:page]).per_page(30)
    end
    @grid.assets
    if (current_user && current_users.admin?)
      @show_column = true
    else
      @show_column = false
    end
  end

在我的网格中 class:

class UsersGrid

  include Datagrid
  scope do
    User.order("users.created_at desc")
  end

  column(:abc, :header => "abc?", :html => true, :if => proc {@show_column == true}) do |user|
    image_tag("abc.png", title: "abc") if user.abc
  end
end

所以在控制器中我设置了 @show_column,在 class 中它应该显示列 :abc 取决于 @show_column 是真还是假。这是错误的,因为 @show_column 是一个实例变量并且在网格 class 中不可用。所以它是零。我应该如何更改它才能使其正常工作?

您可以在创建UsersGrid实例时传递变量,然后将其保存在实例变量中。

在控制器中:

def index
  @show_column = (current_user && current_users.admin?)
  @grid = UsersGrid.new(params[:users_grid], @show_column) do |scope|
    scope.where(admin: false).page(params[:page]).per_page(30)
  end
  @grid.assets
end

在网格中class:

class UsersGrid
  def initialize(*params, show_column)
    super *params
    @show_column = show_column
  end

  # ...
end

对于不是 table.

列的变量,您可以使用 attr_accessor
def index
    params[:users_grid][:show_column] = (current_user && current_users.admin?)
    @grid = UsersGrid.new(params[:users_grid]) do |scope|
      scope.where(admin: false).page(params[:page]).per_page(30)
    end
    @grid.assets    
  end

class UsersGrid

  include Datagrid
  scope do
    User.order("users.created_at desc")
  end
attr_accessor :show_column

  column(:abc, :header => "abc?", :html => true, :if => proc {self.show_column == true}) do |user|
    image_tag("abc.png", title: "abc") if user.abc
  end
end