0

当我尝试使用包含“?”的值更新字段时,update_attributes 返回:

**NoMethodError**
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.reverse

我的控制器能够:

  • 使用“?”创建记录 作为字段名。
  • 如果字段包含“?”,则编辑/保存记录 保持不变
  • 如果字段包含“?”,则编辑/保存记录 更改为“测试”

不能够:

  • 如果字段包含“?”,则编辑/保存记录 更改为“?测试”或“测试?”
  • 如果包含“测试”的字段更改为“?”,则编辑/保存记录

我想 active_record 会忽略未更改的字段,这就是代码在这种情况下有效的原因。

我还在日志中看到 BEGIN 和 ROLLBACK,所以我假设错误是由于 update_record 在将字符串传递到数据库之前未能引用字符串引起的。这是一个错误还是我应该明确引用表单输入?

我的更新方法:

def update
  @interface = Interface.find(params[:id])
  if @interface.update_attributes(params[:interface])
     redirect_to :action => 'show', :id => @interface.id
  else
     redirect_to :action => 'edit' 
  end
end

模型是空白的。

使用 update_attributes!,消息是(编辑,仍然):

NoMethodError in Admin::InterfacesController#update
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.reverse

抱歉,我提到的 ArgumentError 无关紧要。

原始堆栈跟踪: http: //pastebin.com/JQ3Cmrba


通过恢复到 rails 3.0.7 和 mysql 0.2.7 修复。

可能的原因:

“用户名”和“密码”是接口表中的字段。interface_controller 继承自 base_controller:

class Admin::BaseController < ApplicationController

  layout 'admin'
  before_filter :authenticate

  def index
  end
  protected

  def authenticate
     authenticate_or_request_with_http_basic do |username, password|
        if username == 'test' and password == 'pass'
           true
        else
           false
        end
     end
  end
end
4

2 回答 2

1

我有同样的错误。对我来说,它是 gem 'activerecord-jdbc-adapter',我使用 git 版本修复了它:

-gem 'activerecord-jdbc-adapter'
+gem 'activerecord-jdbc-adapter', :git => 'https://github.com/jruby/activerecord-jdbc-adapter.git'

似乎这已在此提交中修复:https ://github.com/jruby/activerecord-jdbc-adapter/commit/837cd489591afbb24f6ba4d36a15a6c4da82b063

于 2011-10-27T20:14:41.963 回答
0

似乎错误出现在一些 ActiveRecord 回调中。尝试在一些 after_save 或其他回调中查找它。在某个地方,您在 nil 对象上使用了 reverse 函数。当值包含 ? 时,处理结果可能是您得到 nil 。如果您发布回调代码,我们可以提供更好的帮助。

于 2011-06-05T17:38:58.760 回答