我已经下载了模板Rails 3 + Mongoid + design并安装了。
我创建了一个脚手架Car与User设计模型的关系。我在我的用户模型中有这样的代码:
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
这里重要的一点是您正在访问给定用户的汽车。同样的原则也适用于其他操作。
第二个选择是改变你的模型,使用引用关系而不是嵌入关系,但如果模型是正确的,那么最好改变控制器和路由。