2015-03-06 3 views
5

Ich versuche, meine SQLite3 Datenbank mit einer einfachen Seed-Datei zu füllen, die ein Bündel o Filme Einträge in der Film-Tabelle erstellen und erstellen Sie dann einige Kommentare sollten zu diesen Filmen, die in der Kommentartabelle gespeichert sind.Sie können nicht nennen erstellen, wenn die Mutter Fehler werden gespeichert, wenn in Schienen Impfen

formats = %w(Beta VHS IMAX HD SuperHD 4K DVD BlueRay) 
30.times do 
    film = Film.create(title: "#{Company.bs}", 
       director: "#{Name.name}", 
       description: Lorem.paragraphs.join("<br/>").html_safe, 
       year: rand(1940..2015), 
       length: rand(20..240), 
       format: formats[rand(formats.length)] 
) 
    film.save 
    (rand(0..10)).times do 
    film.comments.create(author: "#{Name.name}", 
          title: "#{Company.bs}", 
          content: Lorem.sentences(3).join("<br/>").html_safe, 
          rating: rand(1..5) 
    ) 
    end 
end 

Sobald i ausführen rake db: Samen ich unweigerlich den Fehler

Active :: RecordNotSaved: Sie erstellen nicht aufrufen können, wenn die Eltern gespeichert

und keine Datensätze hinzugefügt zu entweder Filme oder Kommentare

Meine film.rb Datei ist

class Film < ActiveRecord::Base 
    has_many :comments 

    validates_presence_of :title, :director 
    validates_length_of :format, maximum: 5, minimum:3 
    validates_numericality_of :year, :length, greater_than: 0 
    validates_uniqueness_of :title 
    paginates_per 4 
end 

Die Längenbegrenzung auf ‚Format‘ wirft den Fehler, wenn ein Film mit Formaten aus dem ‚Format‘ -Liste

+1

Können Sie die Datei film.rb hinzufügen. Ich glaube, aufgrund eines Fehlers wird der Film nicht gespeichert. Wenn Sie also versuchen, Kommentare zu diesem Film zu erstellen, wird er nicht erstellt. Wir müssen herausfinden, welcher Fehler verhindert, dass der Film erstellt wird. – coderhs

+3

oder ändern Sie einfach 'Film.create' in' Film.create! 'Und Sie sollten überprüfen, welche Validierung verhindert, dass Filme gespeichert werden. – basiam

+0

Ich stimme @Coderhs zu. Wir müssen sehen, was Film gehört. Es gibt eine gewisse Logik in Ihrem Modell, die benötigt, dass die Eltern des Films zuerst gespeichert werden. Sobald wir wissen, welcher Film gehört_to müssen Sie zuerst Seed-Daten für den Parent hinzufügen, die die Child-Daten abhängig davon, ob die Logik Sound ist oder nicht, erstellen sollten. – James

Antwort

20

Active :: RecordNotSaved ausgewählt zu schaffen: Sie nicht erstellen können anrufen, wenn die Eltern gespeichert

Dies geschieht, wenn Sie versuchen, ein Kind Verband (Kommentar) zu retten, aber den übergeordneten (Film) noch nicht gespeichert.

Es scheint, dass film nicht gespeichert. Mit Blick auf den Code scheint es, dass film = Film.create(...) Validierungen fehlschlägt und somit film.comments.create(..) nicht fortfahren kann. Ohne mehr darüber zu wissen, welche Validierung fehlschlägt, kann ich nichts sagen.

würde ich mit create!(...) überall in seeds.rb empfehlen. Die Bang-Version löst eine Ausnahme aus, wenn der Datensatz nicht gültig ist, und verhindert stille Fehler.

+0

Dank Ihnen und @coderhs. Mein Fehler war vor dir verborgen, aber dein Rat half mir, es zu verfolgen und mehr zu lernen. Die film.format wurde zufällig aus dieser Liste von Formaten und beschränkt in film.rb zwischen 3 und 5 jedoch die Liste der Formate viel länger ‚Formate‘ erstellen 1. Mit enthalten sind ausgewählt! die Fehler zu sehen ist ein guter Tipp 2. Auch ro.activerecord.errors.messages ist ein i18n Fehler durch die ordnungsgemäße Installation dieses Edelsteins gelöst – Cristi

Verwandte Themen