Mongoid ошибка разработки Mongoid :: Ошибки :: Недействительная коллекция

#ruby-on-rails #devise #mongoid

#ruby-on-rails #разработка #mongoid

Вопрос:

Я загрузил шаблон Rails 3 Mongoid Devise и установил.

Я создал каркасную машину для связи с пользовательской моделью Devise. У меня в моей пользовательской модели есть этот код:

 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 :: Ошибки :: Недействительная коллекция в машинах #индекс

Доступ к коллекции для Car запрещен, поскольку это встроенный документ, пожалуйста, получите доступ к коллекции из корневого документа.

В чем проблема в этом коде? Спасибо

Ответ №1:

В вашей модели нет ничего плохого, но маршруты и действия контроллера, сгенерированные каркасом, пытаются напрямую выполнить запрос к коллекции Cars, и поскольку Cars встроены в User, вы не можете сделать это с помощью Mongoid, как указано в сообщении об ошибке. В нынешнем виде автомобили доступны только через пользовательский объект.

Есть несколько возможных способов обойти это. Во-первых, без изменения модели вам нужно будет изменить маршруты и действия. С этой моделью (автомобили, встроенные в пользователей), вероятно, имеет смысл использовать вложенный маршрут:

 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
  

Важным моментом здесь является то, что вы получаете доступ к автомобилям для данного пользователя. Тот же принцип применим к другим действиям.

Вторым вариантом было бы изменить вашу модель, чтобы использовать ссылочное отношение, а не встроенное, но если модель правильная, то лучше изменить контроллер и маршруты.

Комментарии:

1. У меня есть ссылка на использование, и теперь все в порядке: D. Большое вам спасибо!