5

我在 ActiveAdmin 中遇到了这个问题。有时,当我访问带有未定义变量的页面时,服务器会启动一种“无限循环”,不显示错误消息并增加 CPU 和内存使用率,直到我不得不杀死它。

这是一个例子:

我有一个 Answers 表,这是 answers.rb 中的一段代码:

show :title => proc { answer.id } do
  panel 'Answer' do
    .
    .
  end
  .
  .
end

这段代码不起作用并显示错误:“未定义的局部变量或方法'answer'”

我必须写

show :title => proc { @answer.id } do

解决这个问题。

但是我有一个用户表,这是 users.rb 中的一段代码:

show :title => proc{ @user.name } do
  panel 'User details' do
    .
    .
  end
  .
  .
end

如果我写

show :title => proc{ user.name } do

我得到了上面详述的问题,没有错误消息并且 CPU 和内存使用量增加。

我真的不想知道为什么这两段代码之间有不同的行为,我想知道在这种情况下如何显示错误消息而不是没有错误和 cpu / 内存增加。

非常感谢

4

3 回答 3

0

根据评论,听起来像是分页问题。尝试:

class User < ActiveRecord::Base
  paginates_per 25
end

看看这是否有帮助。在 AA 0.4.0 中发现了一个问题:https ://github.com/gregbell/active_admin/issues/996

于 2013-02-14T14:43:37.820 回答
0

我终于发现出了什么问题!

在用户秀上,a SELECT * FROM users请求被执行,试图创建超过 300 000 个活动记录对象,防止服务器显示“未定义变量错误”并增加 CPU 和内存使用率。

对于 Answer show 上的相同错误,我认为SELECT * FROM answers执行了请求但错误正确显示,因为 answers 表的记录少得多。但是,经过检查,我发现它是错误的,没有执行 SELECT * 请求。

然后我检查了 answers.rb 和 users.rb 之间的差异,我在 users.rb 中发现了这个:

ActiveAdmin.register User do

  scope_to :association_method => :scoped do
    User.includes([:current_device => [:current_device_config, :current_push_config],:current_web_device => [:current_device_config, :current_push_config]])
  end

检查 Active Admin 文档后,我意识到它不正确。

我把它移到:

controller do
  def scoped_collection
    User.includes([:current_device => [:current_device_config, :current_push_config], :current_web_device => [:current_device_config, :current_push_config]])
  end

现在,没有SELECT * FROM users执行并且正确显示“未定义变量“用户”错误。

谢谢,你真的帮了我

于 2013-02-14T17:37:05.523 回答
0

我也遇到了这个问题,并且应该指出,如果您使用 better_errors 或任何其他在出现异常时将转储范围内变量值的工具,您最终可能会执行和转储 ActiveRelation 对象。在我的例子中,为了转储实际上只包含 ActiveRelation 的变量的值,将获取表中的数百万行。

我正在使用 Pow,当这种情况发生时,ruby 进程将继续运行,直到机器内存不足并且无法使用。杀死红宝石进程是恢复的唯一方法。

为了解决这个问题,我需要运行rails server老式的方法并直接检查输出。这让我可以立即杀死红宝石。也可以进行检查log/development.log

于 2013-07-02T18:09:48.970 回答