Попытка просмотра ссылочного документа: недопустимый формат ObjectId

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

BSON::InvalidObjectId in Tasks#index

Ошибка находится в строке '‹%= task.tag.title %>' в файле index.html.erb.

пользователь.rb

class User
  include Mongoid::Document
  field :name
  validates_presence_of :name
  validates_uniqueness_of :name, :email, :case_sensitive => false

  attr_accessible :name, :email, :password, :password_confirmation

  embeds_many :tags
  embeds_many :tasks

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

тег.rb

class Tag
  include Mongoid::Document
  field :title
  embedded_in :user, :inverse_of => :tags
  references_many :tasks
end

задача.rb

class Tag
  include Mongoid::Document
  field :title
  embedded_in :user, :inverse_of => :tags
  references_many :tasks
end

index.html.erb

<% @tasks.each do |task| %>
  <tr>
    <td><%= task.name %></td>
    <td><%= task.tag.title %></td>
  </tr>
<% end %>

Спасибо,


person Berek Bryan    schedule 21.02.2011    source источник


Ответы (1)


Недавно я сам столкнулся с подобной проблемой (2.0.0.rc.7). В моем случае collection_select в Rails заканчивался записью пустого строкового значения в поле ссылки (например, tag_id). Когда mongoid попытался перезагрузить документ, и мой код ссылался на ассоциацию, ему не удалось преобразовать пустую строку в действительный идентификатор объекта BSON.

Похоже, что это известная проблема, и она была исправлена, но еще не попала в новую сборку.

https://github.com/mongoid/mongoid/issues/closed#issue/651

https://github.com/mongoid/mongoid/issues/closed#issue/690

Тем временем я решил обойти проблему, написав обработчик события before_save для преобразования пустых строковых значений в nil. например

  before_save :before_save
  def before_save
    self.tag_id = nil if self.tag_id == ''
  end

Это всего лишь обходной путь, и в версии 2.0.0.rc.8 он не нужен. Это только остановит сохранение недопустимых ссылок на объекты, но не очистит данные, которые уже находятся в базе данных.

person Steve    schedule 21.02.2011
comment
Я обновился до 2.0.0.rc.7 с 2.0.0.beta.20. Так что у меня больше нет той же проблемы. Теперь у меня возникла описанная вами проблема с моим collection_select. Если вы отредактируете свой ответ, чтобы обновить его до самой последней версии и описать событие before_save, то представитель будет полностью вашим. - person Berek Bryan; 21.02.2011