Ruby实例变量总是在`def initialize`

时间:2015-05-28 09:55:19

标签: ruby-on-rails ruby ruby-on-rails-4 instance-variables

我有一个控制器方法,它将实例变量@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。任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

根据documentation,替换:

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

使用:

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

或:

:if => :show_column

答案 1 :(得分:0)

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