2017-03-01 6 views
0

Datamapper 덕분에 기존 데이터에 액세스하려고했습니다. 하지만 작동하지 않습니다. .first, .all과 같은 모든 메소드는 아무 것도 반환하지 않습니다. 나는 데이터베이스가 비어 있지 확신 ...왜 datamapper 메서드가 작동하지 않습니까?

undefined method update for nil:NilClass (NoMethodError) 반환 .update 때문에이 코드 리턴 아니라 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 

이 전체 코드입니다 :

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 

답변

0

new_consultation.save 검사에 저장하기 전에 개체가 유효한지 확인하십시오. 개체가 유효하면 저장하고 true을 반환합니다. 그렇지 않으면 저장하지 않고 false를 반환합니다.

그것은 당신이 지정했기 때문에 개체가 유효 다음과 같습니다 환불이 필요한 경우

property :refund, Text, required: true 

, 당신은 나 개체를 저장하지 않습니다 지정해야합니다. date 때문에 puts new_consultation.date 작품은 여전히 ​​save이 실패 할 경우에도, 로컬 객체에 저장된 데이터 중 어느 것도 데이터베이스에 저장되지 않도록

참고.

+0

답장을 위해 @eiko에게 감사드립니다. 실제로 나는 환불이 요구되기를 원하지 않는다. 그러나 나는'required : true'를 제거하려고 시도하는데, 나는 "NOT NULL 제약 조건이 실패했습니다 : consultations.refund (DataObjects :: IntegrityError)"라는 에러 메시지가 나타납니다. 테스트하기 위해 나는'refund' 속성을'require : true'로 설정하고 그것을 설정합니다 ('new_consultation.refund = "no"'). 그러면 작동 중입니다. 하지만이 오류가 발생하지 않고'require : true'를 제거 할 수 있습니다. 어떻게 해결할 수 있습니까? – Orsay

+0

@Orsay 구체적으로'require : false'를 넣어보십시오. – eiko

+0

'require : false'를 넣고 설정 ('consultation.refund = 'no refund')하면 작동합니다. 하지만 그것을 설정하지 않으면'NOT NULL 제약 조건이 실패했습니다 : consultations.refund (DataObjects :: IntegrityError)' – Orsay