Ruby实例变量在' def initialize '之外总是nil



我有一个控制器方法,它将实例变量@show_column传递给网格类。问题是,尽管实例变量的值在网格类的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 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。我使用了一个调试器,试图找到一些额外的信息。I表示控制器中@show_column设置正确;它的值是true,因为它应该是我登录的用户。同样, def initialize里面,它的值是true。但是,在网格类 def initialize之外的,其值为nil。有办法解决这个问题吗?

根据文档,替换为:

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

:

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

或:

:if => :show_column

在类声明中,self是类本身,而不是类的实例。因此,@show_columnUsersGrid的实例变量,而不是UsersGrid的实例变量。

最新更新