无法从方法内访问模型中的实例变量

时间:2016-01-11 02:47:47

标签: ruby-on-rails ruby

我正在开发一个Rails应用程序,我遇到了一个小问题,但我似乎无法找到与我的某些案例相关的任何信息。

我在下面一个类的实例中调用undefined method error '[]' for NilClass方法时得到add_user

class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
  @user_info = Hash.new

  def add_user(user_id)
    new_info = OpenStruct.new
    new_info.score1 = 0
    new_info.score2 = 0
    @user_info[user_id] = new_info
  end

  ...

end

为什么会发生这种情况,我该如何解决?在C ++,Java程序中,等效的工作正常,但我猜Ruby的工作方式有点不同。

2 个答案:

答案 0 :(得分:1)

当你在@user_info = Hash.new的类定义的主体中使用Group时,Ruby的作用域规则规定@user_infoGroup实例的Class实例的实例变量。班级self。只有在Groupself时才能访问,而GroupGroup的实例时则无法访问。

您可以通过在class Group < ActiveRecord::Base has_and_belongs_to_many :users @user_info = Hash.new def self.user_info @user_info end def add_user(user_id) new_info = OpenStruct.new new_info.score1 = 0 new_info.score2 = 0 self.class.user_info[user_id] = new_info # OR: Group.user_info[user_id] = new_info end end 上定义单例方法,让自己访问类级实例变量。

inputString.split(":")

答案 1 :(得分:0)

由于您的类是ActiveRecord::Base的子类,因此您可能不应该覆盖构造函数。您可以在after_initialize挂钩中进行初始化:

class Group < ActiveRecord::Base
  after_initialize do
    @user_info = {}
  end

  # Other stuff here
end
顺便说一下,ruby和其他语言之间存在巨大差异:直接在类中定义的实例变量属于类本身,而不属于其实例。只有那些实例变量在实例方法属于该类的实例。