rails中Struct中的未定义局部变量

时间:2016-08-23 08:12:32

标签: ruby-on-rails

我有一个课程如下:

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)之类的内容。

1 个答案:

答案 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