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_column
是UsersGrid
的实例变量,不是UsersGrid
.
实例的实例变量
根据documentation,替换为:
:if => proc {@show_column == true})
与:
:if => proc { |grid| grid.show_column == true})
或:
:if => :show_column
我有一个控制器方法将实例变量 @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_column
是UsersGrid
的实例变量,不是UsersGrid
.
根据documentation,替换为:
:if => proc {@show_column == true})
与:
:if => proc { |grid| grid.show_column == true})
或:
:if => :show_column