2017-03-01 5 views
0

Ich habe versucht, mit Datamapper auf meine vorhandenen Daten zuzugreifen. Aber es funktioniert nicht. Alle Methoden wie .first, .all, ... geben nichts zurück. .update eine undefined method update for nil:NilClass (NoMethodError) Rückkehr ...Warum Datamapper-Methoden nicht funktioniert?

Ich bin sicher, dass die Datenbank, da dieser Code Rückkehr nicht leer ist gut die new_consultation.date

new_consultation = Consultation.new 
new_consultation.name = name_prestation 
new_consultation.expense = expense_prestation 
new_consultation.date = date_prestation.empty? ? Time.now.strftime("%d/%m/%Y") : date_prestation 
new_consultation.save 
puts new_consultation 
puts new_consultation.date 

Dies ist der gesamte Code:

DataMapper.setup(:default, 'sqlite:medical_expenses.db') 
class Consultation 
    include DataMapper::Resource 

    property :id, Serial 
    property :name, Text, required: true 
    property :expense, Text, required: true 
    property :date, Text, required: true 
    property :refund, Text, required: true 
end 
DataMapper.finalize() 
DataMapper.auto_upgrade!() 

# Enter and save new consultation 
puts 'Prestations ?' 
name_prestation = gets.chomp 
puts 'Montant ?' 
expense_prestation = gets.chomp 
puts 'Date ? (par défaut date du jour)' 
date_prestation = gets.chomp 
print "Dépense enregistrée" 

new_consultation = Consultation.new 
new_consultation.name = name_prestation 
new_consultation.expense = expense_prestation 
new_consultation.date = date_prestation.empty? ? Time.now.strftime("%d/%m/%Y") : date_prestation 
new_consultation.save 
puts new_consultation 
puts new_consultation.date 

Consultation.first.update(refund: 'none') 
puts Consultation.first 

Antwort

0

new_consultation.save Kontrollen Prüfen Sie, ob Ihr Objekt vor dem Speichern gültig ist. Wenn das Objekt gültig ist, wird es gespeichert und true zurückgegeben; Andernfalls wird nicht gespeichert und `false 'zurückgegeben.

Es sieht aus wie Ihr Objekt ungültig ist, weil Sie angegeben haben:

property :refund, Text, required: true 

Wenn Erstattung erforderlich ist, müssen Sie es oder das Objekt angeben, nicht speichern.

Beachten Sie, dass puts new_consultation.date funktioniert, weil date immer noch im lokalen Objekt gespeichert ist, auch wenn save fehlschlägt und keine Daten in der Datenbank gespeichert werden.

+0

Dank @eiko für Ihre Antwort. Eigentlich will ich keine Rückerstattung verlangen. aber ich versuche zu entfernen "erforderlich: wahr" und ich bekomme diesen Fehler: "NOT NULL Constraint fehlgeschlagen: conscriptions.refund (DataObjects :: IntegrityError)". Nur um zu testen, versuche ich 'Attribute 'auf' require: true' zurückzusetzen und setze es ('new_consultation.refund =" no "'), und dann schreibst du, weil es funktioniert! Aber ich kann das 'require: true' entfernen, ohne diesen Fehler zu haben, weißt du, wie ich das beheben kann? – Orsay

+0

@Orsay können Sie versuchen, "require: false" spezifisch zu setzen, um zu sehen, ob das funktioniert? – eiko

+0

Wenn ich 'require: false' setze und immer noch setze ('requestation.refund = 'keine Rückerstattung')' es funktioniert. Aber wenn ich es nicht setze, bekomme ich 'NOT NULL constraint failed: conscriptions.refund (DataObjects :: IntegrityError)' – Orsay