无法在关联方法上重复NilClass

时间:2010-02-15 10:07:36

标签: ruby-on-rails ruby

我正在使用rails 2.3.5和ruby 1.8.7。我正在建立一个简单的TODO经理。我拥有属于用户的任务,用户有很多任务。

我正在使用acts_as_taggable_on_steroids插件标记任务,restful_authentication plugin用于注册和用户管理。

我收到了一个奇怪的错误,在索引操作的视图中显示“无法复制NilClass”。这就是控制器代码 -

@tasks = current_user.tasks

当我在视图上迭代@tasks时发生错误。那是我做@tasks.each do |task|

的时候

现在我用这个

替换控制器代码
@tasks = Task.find(:all, :conditions => {:user_id => current_user.id})

实际上是获取相同的记录。这仅在开发模式下发生。我猜这与缓存或加载有关。

可能有什么不对?我是第一次面对这个问题。

修改

好的,这绝对是一个缓存问题。如果我做 在production.rb中config.cache_classes = true,生产模式中也会出现同样的错误。但是我现在如何解决这个问题呢?因为我不想为模型/控制器中的每个更改重新加载服务器。

修改

以下是我的用户模型的样子

class User < ActiveRecord::Base
  has_many :tasks
  has_many :projects

  # There are some validations and standard methods that resful authentication 
  # provides that I am not showing here

end

这就是Task模型的样子。

class Task < ActiveRecord::Base
  belongs_to :bin
  belongs_to :project
  belongs_to :user

  acts_as_taggable

  def tag_list
    super.join(', ')
  end

end

任务控制器的索引方法如下所示

def index
  @tasks = current_user.tasks

  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @tasks }
  end
end

希望这有帮助。

2 个答案:

答案 0 :(得分:5)

知道了。

来自here

  

某些类继承或   包含在引擎控制器中   可能无法卸载并导致   第一次请求后出现问题   你的系统。

对我来说,这是因为我在lib中有一个文件是猴子修补用户模型和 我想这个文件中的用户模型类没有被缓存。

在lib文件夹中调用该类中的unloadable就可以了。所以我的lib文件看起来像这样

class User < ActiveRecord::Base
  unloadable
  # stuff...
end

非常感谢。

答案 1 :(得分:0)

也许模型中的关联有问题。你能从那里粘贴一些代码吗?

您也可以尝试在控制台中执行相同的操作。它会给出同样的错误吗?看看日志,你的两个例子都生成相同的SQL查询吗?