我有一个课程如下:
class TempUser < Struct.new(:user)
user.attributes.keys.each do |attribute|
delegate attribute, to: :user
end
end
当我尝试在rails控制台中使用它时,我得到:
$> tmp = TempUser.new(User.last)
NameError: undefined local variable or method `user' for TempUser:Class
但如果我将user.attributes
替换为User.new.attributes
则可行。
这不是由于循环,实际上我只是做了同样的错误:
class TempUser < Struct.new(:user)
test = user
end
我想我错过了一些东西,但我不知道它是什么,有什么想法吗?
修改
在我的示例中可能不相关,但根据我的需要,我需要用户的属性,因此我不能使用User.columns.map(&:name)
之类的内容。
答案 0 :(得分:0)
您有此错误,因为当ruby解析此类时,它会将user
理解为可从错误消息中清除的类变量:'user' for TempUser:Class
:user
它是一个实例变量:
TempUser = Struct.new(:user)
tmp = TempUser.new(User.last)
=> #<struct TempUser user=#<User id: 1>>
所有用户都具有相同的属性,我认为您可以使用以下内容:User.columns.map(&:name)
修改
如果每个用户可能具有不同的属性,我认为您可以使用method_missing
TempUser = Struct.new(:user) do
def method_missing(m, *args, &block)
return user.send(m) if user.respond_to?(m)
super
end
end