我正在开发一个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的工作方式有点不同。
答案 0 :(得分:1)
当你在@user_info = Hash.new
的类定义的主体中使用Group
时,Ruby的作用域规则规定@user_info
是Group
实例的Class
实例的实例变量。班级self
。只有在Group
为self
时才能访问,而Group
是Group
的实例时则无法访问。
您可以通过在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和其他语言之间存在巨大差异:直接在类中定义的实例变量属于类本身,而不属于其实例。只有那些实例变量在实例方法属于该类的实例。