我有一个控制器方法,它将实例变量@show_column
传递给网格类。问题是尽管实例变量的值在网格类的def initialize
中可用,但nil
以外的def initialize
:
控制器方法:
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
。我使用调试器试图找到一些额外的信息。我表明在控制器中正确设置了@show_column
;它的值为true
,因为它应该给我登录的用户。此外,内部 def initialize
其值为true
。但是,网格类中的外部 def initialize
,其值为nil
。任何想法如何解决这个问题?
答案 0 :(得分:1)
根据documentation,替换:
:if => proc {@show_column == true})
使用:
:if => proc { |grid| grid.show_column == true})
或:
:if => :show_column
答案 1 :(得分:0)
在类声明中,self
是类本身,而不是类的实例。因此,@show_column
是UsersGrid
的实例变量,而不是UsersGrid
实例的实例变量。