#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. Большое вам спасибо!