Rails 3 - Использование build-ошибки, неопределенный метод `build 'для # <класса: 0x10338c828 - PullRequest
1 голос
/ 30 января 2011

У меня есть две модели:

class Thread < ActiveRecord::Base
  has_many :attachments
end

class Attachment < ActiveRecord::Base
  belongs_to :thread
end

При создании новой темы я хочу создавать вложения перед сохранением. Я делаю:

@thread.attachments.build(...)

но это ошибка с: failed with NoMethodError: undefined method `build' for #<Class:0x10338c828

Ответы [ 2 ]

3 голосов
/ 30 января 2011

Вы можете использовать @thread.attachments.build для создания нового несохраненного вложения.

Если у вас :autosave => true на вашем has_many (явно или через accepts_nested_attributes_for), они будут сохранены при сохранении родительского потока.

Для правильной работы новых записей может потребоваться установить :inverse_of для ассоциаций для сохранения:

class Thread < ActiveRecord::Base
  has_many :attachments, :inverse_of => :thread, :autosave => true
end

class Attachment < ActiveRecord::Base
  belongs_to :thread, :inverse_of => :attachments
end

Как упоминалось @zetetic: Thread - это встроенный класс Ruby, и вы не должны использовать то же имя, что и системный класс в своем приложении.

Существует ряд классов на любом языке, которые вы учите не использовать. В таких случаях я бы добавил что-то к своему имени класса, чтобы сделать его более наглядным, предполагая, что нет лучшего имени в целом. Взяв удар в том, что вы приложение, вы должны переименовать это с Thread на что-то вроде Message или MessageThread.

Что происходит, так как Thread является базовым классом, который загружается перед кодом вашего приложения. В памяти уже есть класс Thread, и Rails не ищет его в режиме разработки при первом обращении к нему. Rails загружает ваши классы по требованию в процессе разработки путем поиска файла thread.rb, когда на ссылку Thread ссылаются, и в данный момент она не загружена.

В рабочем режиме Rails загружает все классы при запуске, и отличающийся базовый класс (Object против ActiveRecord::Base) приведет к TypeError.

1 голос
/ 30 января 2011

Thread - зарезервированное слово в Ruby - я бы предложил переименовать вашу модель.

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