我有一个控制器方法,它将实例变量@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_column
是UsersGrid
的实例变量,而不是UsersGrid
的实例变量。