Ruby `def initialize` 之外的实例变量总是 nil

Ruby instance variable always nil outside `def initialize`

我有一个控制器方法将实例变量 @show_column 传递给网格 class。问题是,虽然实例变量的值在网格class的def initialize中可用,但在def initialize之外是nil

控制器方法:

  def index
    @show_column = (current_user && current_user.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
  include Datagrid
  attr_reader :show_column

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

  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

问题在最后:proc {@show_column == true}。这不起作用,因为 @show_column 总是 nil。我使用调试器试图找到一些额外的信息。我显示 @show_column 在控制器中设置正确;它的值是 true 因为它应该被赋予我登录的用户。还有,里面def initialize它的值是true。但是,def initialize内格class,其值为nil。有什么解决办法吗?

在 class 声明中,self 是 class 本身,而不是 class 的实例。所以,@show_columnUsersGrid的实例变量,不是UsersGrid.

实例的实例变量

根据documentation,替换为:

:if => proc {@show_column == true})

与:

:if => proc { |grid| grid.show_column == true})

或:

:if => :show_column