尝试查看引用的文档:非法的 ObjectId 格式

发布于 2024-10-18 14:11:31 字数 1186 浏览 0 评论 0原文

尝试查看引用文档的属性。问题出在任务的索引文件中。当我尝试显示与任务关联的标签时,出现以下错误:

BSON::InvalidObjectId in Tasks#index

错误位于 '<%= task.tag.title %>' index.html.erb 文件中的行。

user.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

tag.rb

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

task.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 %>

谢谢,

Trying to view an attribute to a referenced document. The issue is in the task's index file. When I try to display the tag associated with the task I get the following error:

BSON::InvalidObjectId in Tasks#index

The error is on '<%= task.tag.title %>' line in the index.html.erb file.

user.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

tag.rb

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

task.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 %>

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故事↓在人 2024-10-25 14:11:31

我最近遇到了类似的问题(2.0.0.rc.7)。就我而言,Rails collection_select 最终将空字符串值写入引用字段(例如 tag_id)。当 mongoid 尝试重新加载文档并且我的代码引用该关联时,它无法将空字符串转换为有效的 BSON 对象 ID。

看起来这是一个已知问题并已修复,但尚未将其纳入新版本。

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

https://github.com/mongoid/mongoid/issues/lined #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 来说应该是不必要的。它只会停止保存无效的对象引用,不会清除数据库中已有的任何数据。

I ran into a similar problem myself recently (2.0.0.rc.7). In my case a Rails collection_select was ending up writing an empty string value into a reference field (e.g. tag_id). When mongoid attempted to reload the document and my code referenced the association it failed to convert empty string to a valid BSON object ID.

It looks like it is a known issue and has been fixed but hasn't made it into a new build just yet.

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

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

In the meantime I ended up working around the problem by writing a before_save event handler to convert the empty string values to nil. e.g.

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

Its just a workaround and should be unecessary with 2.0.0.rc.8. It will only stop invalid object references being saved, it won't clean up any data that is already in the database.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文