Rails: почему у меня возникают проблемы с доступом к этой переменной-члену в методе контроллера? - PullRequest
4 голосов
/ 31 января 2010

Я вижу очень странную проблему с простым методом контроллера. Либо я упускаю что-то фундаментальное, либо я сталкиваюсь с ошибкой. Моя ставка на первое.

У меня есть Thing модель с ThingController.

A Thing имеет две переменные, name и display, обе строки.

ThingController (код ниже) имеет метод toggle_display, который переключает содержимое display между "on" и "off".

Проблема в том, что когда я вызываю это действие, Rails находит правильный Thing, но @thing.display равен нулю. Когда я проверяю базу данных, значение в столбце 'display' является правильным.

Странная часть в том, что когда я раскомментирую третью строку в приведенном ниже коде (то есть доступ @thing.name до доступа к @thing.display), тогда @thing.display в порядке - это нормально не ноль, и он имеет значение, которое я ожидал. Как будто @thing.display правильно инициализируется только после доступа к @thing.name.

Есть идеи, почему я вижу это очень странное поведение?

def toggle_display
  @thing = Thing.find(params[:id])

  # @thing.name

  if @thing.display
    @thing.toggle_display_in_model
    @thing.save
  end

  redirect_to things_url
end

1 Ответ

7 голосов
/ 31 января 2010

Проблема в том, что в Kernel уже есть метод с именем display, который конфликтует с магией ActiveRecord.

ActiveRecord определяет методы, соответствующие полям базы данных в method_missing. Поэтому, пока не будет вызван method_missing, методы на самом деле не существуют. Когда вы вызываете имя на @thing, вызывается method_missing, потому что нет имени метода. Однако, когда вы вызываете display (без предварительного вызова другого метода, который не существует), method_missing не вызывается, потому что display уже определен в ядре, и это определение выполняется. И так как метод отображения Kernel возвращает nil, вы получаете nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...