Mongoid + devise error Mongoid::Errors::InvalidCollection



我已经下载了模板Rails 3 + Mongoid + design并安装了。

我创建了一个脚手架CarUser设计模型的关系。我在我的用户模型中有这样的代码:

class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and       :omniauthable
  devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable
  field :name
  validates_presence_of :name
  validates_uniqueness_of :name, :email, :case_sensitive => false
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me
  embeds_many :cars
  end

和我的汽车模型我有下一个代码:

class Car
  include Mongoid::Document
  field :title
  field :description
  field :image_url
  field :price
  field :published_on, :type => Date
  validates_presence_of :title, :description, :image_url, :price
validates :title, :length   => { :maximum => 70 }
validates :description, :length   => { :maximum => 2000 }
validates :price, numericality: {greater_than_or_equal_to: 0.01}
validates :image_url, allow_blank: true, format: {
  with:
  %r{.(gif|jpg|png)$}i,
  message: 'must be a URL for GIF, JPG or PNG image.'
  }
  embedded_in :user, inverse_of: :cars
end

当我刷新页面时,我得到下一个错误:

Mongoid::Errors::InvalidCollection in Cars#index

不允许访问Car的集合,因为它是一个嵌入式文档,请从根文档访问集合。

这段代码有什么问题?谢谢

您的模型没有任何问题,但是scaffold生成的路由和控制器动作试图直接在Cars集合上运行查询,并且由于Cars嵌入在User中,因此您不能像错误消息所指示的那样使用Mongoid进行查询。目前car只能通过User对象访问。

有几种可能的方法来解决这个问题。首先,在不更改模型的情况下,您需要更改路由和操作。对于这个模型(Cars嵌入到Users中),使用嵌套路由可能是有意义的:

resources :users do
  resources :cars
end

这将导致URL users/:user_id/cars映射到CarsController中的索引操作,可能看起来像这样:

def index
  user = User.find(params[:user_id])
  @cars = user.cars
  # code to render view...
end

这里重要的一点是您正在访问给定用户的汽车。同样的原则也适用于其他操作。

第二个选择是改变你的模型,使用引用关系而不是嵌入关系,但如果模型是正确的,那么最好改变控制器和路由。

最新更新