Не могу дублировать NilClass на методы связи - PullRequest
3 голосов
/ 15 февраля 2010

Я использую рельсы 2.3.5 и ruby ​​1.8.7. Я строю простой менеджер TODO. Где у меня есть задачи, которые принадлежат пользователю, и у пользователя есть много задач.

Я использую плагин acts_as_taggable_on_steroids для тегирования задач и restful_authentication plugin для регистрации и управления пользователями.

Я получаю странную ошибку, которая гласит «Can't dup NilClass» в представлении действия с индексом. Это то, что код контроллера -

@tasks = current_user.tasks

Ошибка возникает, когда я перебираю @tasks в представлении. Вот когда я делаю @tasks.each do |task|

Теперь, когда я заменяю код контроллера на этот

@tasks = Task.find(:all, :conditions => {:user_id => current_user.id})

Который на самом деле выбирает те же записи. Это происходит только в режиме разработки. Я предполагаю, что это как-то связано с кэшированием или загрузкой.

Что может быть не так? Я сталкиваюсь с этой проблемой впервые.

EDIT

Хорошо, это определенно проблема с кэшированием. Если я сделаю config.cache_classes = true в production.rb, такая же ошибка возникает и в производственном режиме. Но как мне это исправить сейчас? Потому что я не хочу перезагружать сервер для каждого изменения, которое я делаю в моделях / контроллерах.

EDIT

Вот как выглядит моя модель пользователя

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 ]

5 голосов
/ 15 февраля 2010

Понял.

С здесь ,

Некоторые из классов унаследованы или включены в ваши контроллеры двигателя может не выгружаться и вызывать неприятности после первого запроса ваша система.

Для меня это было потому, что у меня был файл в lib, который был обезьяной, исправляющей модель пользователя и Полагаю, что класс модели пользователя в этом файле не кэшируется.

Вызов unloadable в этом классе в папке lib сделал свое дело. Итак, мой lib-файл выглядит так

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

В любом случае, спасибо.

0 голосов
/ 15 февраля 2010

Возможно, что-то не так с ассоциациями в модели. Вы можете вставить какой-нибудь код оттуда?

Вы также можете попробовать сделать то же самое в консоли. Это дает ту же ошибку? Посмотрите в журналах, генерирует ли оба ваших примера один и тот же SQL-запрос?

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