update_attributes NoMethodError, когда значение формы содержит вопросительный знак в рельсах 3.1 - PullRequest
0 голосов
/ 05 июня 2011

Когда я пытаюсь обновить поле со значением, содержащим '?', 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

Мой контроллер может:

  • Создать запись с помощью '?' как имя поля.
  • Редактировать / сохранить запись, если поле содержит '?' оставлено без изменений
  • Редактировать / сохранить запись, если поле содержит '?' изменен на «тест»

Не может:

  • Редактировать / сохранить запись, если поле содержит «?» изменяется на «? test» или «test?»
  • Редактировать / сохранить запись, если поле, содержащее «test», заменено на «?»

Я полагаю, что 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


ИСПРАВЛЕНО путем возврата к рельсам 3.0.7 и mysql 0.2.7.

Возможная причина:

'username' и 'password' - это поля в таблице интерфейса. 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

Ответы [ 2 ]

1 голос
/ 28 октября 2011

у меня была такая же ошибка. для меня это был гем '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

0 голосов
/ 05 июня 2011

Кажется, ошибка в некотором обратном вызове ActiveRecord. Попробуйте поискать его в некотором after_save или другом обратном вызове. Где-то вы используете функцию реверса для нулевого объекта. Может быть, вы получаете ноль в результате обработки, когда значение содержит? Мы могли бы помочь лучше, если вы отправите код обратного вызова.

...