Mongoid, no persistence on embedded documents

600 views Asked by At

I'm very annoyed with mogoid and embedded documents. I can't find the proper way to create, edit, or destroy them. I've tried all methods i've found around the web, but none of them seems to work.

I've also tried many tests on the rails console, but, still no result... All the test that i've done, stays unpersistent in the DB.

Here is the main class :

class Boxer
  include Mongoid::Document
  include Mongoid::Paperclip

  store_in collection: "Boxers"

  field :NumeroLof
  field :Couleur
  field :DateNaissance
  .... many fields ...
  field :Contacts
  field :PublicationEtalon

  has_mongoid_attached_file :Image
  validates_attachment_content_type :Image, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]

  embeds_many :Certificats, as: :Certificat
  accepts_nested_attributes_for :Certificats, allow_destroy: true
end

A boxer object should look like something like this :

{
"_id" : ObjectId("584676a482ed3c1bc77484b3"),
"NumeroLof" : 1316Ae024,
"Name" : "SHEBA",
"Affixe" : "DU JABELIN",
"DateNaissance" : ISODate("2001-05-24T00:00:00.000Z"),
"Sexe" : "F",
"Couleur" : "B",
"Identification" : "2AXZ279",
"Certificats" : [ 
    {
        "Exposition" : "EYRAGUES NE",
        "Date" : ISODate("2011-06-26T00:00:00.000Z"),
        "Juge" : "P. Asensi",
        "Observation" : "",
        "Denomination" : "M-VET",
        "_id" : ObjectId("58467f1082ed3c1bc77557b3")
    }, 
    {
        "Exposition" : "PRADINES RE",
        "Date" : ISODate("2011-08-14T00:00:00.000Z"),
        "Juge" : "R. Pras",
        "Observation" : "",
        "Denomination" : "M-VET",
        "_id" : ObjectId("58467f1082ed3c1bc77557bd")
    }
]

}

And finally, here is my CertificatsController:

class CertificatsController < ApplicationController
      before_action :load_boxer
      before_action :load_certificat, only: [:show, :edit, :update, :destroy]

      # GET /boxer/:id/certificates/
      def index
        @certificats = @boxer.Certificats
      end

      # GET /boxer/:id/certificates/:id/
      def show
      end

      # GET /boxer/:id/certificates/new
      def new
        @certificat = @boxer.Certificat.new
      end

      # POST /boxer/:id/certificates/
      def create
        @certificat = Certificat.build(certificat_params)
        if @certificat.save
          @boxer.Certificats.new(@certificat)
          @boxer.reload
          redirect_to boxer_certificats_path(@boxer), notice: "Nouveau certificat créé avec succès" and return
        end
        render 'new'
      end

      def edit
      end

      def update
        if @certificat.update_attributes(certificat_params)
          @boxer.reload
          redirect_to boxer_certificats_path(@boxer), notice: "le certificat a été mis à jour!" and return
        end

        render 'edit'
      end

      def destroy
        @certificat.destroy
        @boxer.reload
        redirect_to boxer_certificats_path, notice: "le certificat a été supprimé!" and return
      end

      private
      def certificat_params
        params.require(:certificat).permit(:Denomination, :Date, :Exposition, :Juge,
        :Observation)
      end

      def load_boxer
        @boxer = Boxer.find(params[:boxer_id])
      rescue Mongoid::Errors::DocumentNotFound
        not_found
      end

      def load_certificat
        @certificat = @boxer.Certificats.find(params[:id])
      end

    end

Actually, I've got no problem for index and show methods, but all CRUD operations fail, there is no persistence of my queries.

Thanks in advance for your replies.

2

There are 2 answers

0
Martin Calvert On

It has been awhile since I ran into an issue that sounds very similar. I am wondering if the objects are not getting marked as dirty/changed. They way I always got around this was.

class Boxer
  embeds_many :Certificats, as: :Certificat
end

b = Boxer.new
b.certificats_will_change!
b.certificats = Certifcat.new
b.save!
0
L.Eymael On

I've found the mistake i made by myself. For those who might wondering, here is the point: In the Certificate class, a embedded_in Boxer was needed ...