2013-02-01 1 views
-1

이 코드를 실행하려고하면 "self.save ..."행에서 IllegalContextError가 발생합니다. 내가 뭘 잘못하고 있는지 말해 줄 수있어?datamapper 모델을 저장하려고 할 때 IllegalContextError를 어떻게 해결할 수 있습니까?

저는 Player에서 initialize를 사용하지 않고 create 메소드를 호출하기 만합니다. 그러나 관련 week 객체가 초기화의 일부로 생성되기를 바랍니다.

require 'data_mapper' 

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/prod.db") 

class Player 

    include DataMapper::Resource 
    property :name, String, :key => true 
    property :sport, String 

    has n, :weeks 

    def initialize(name, sport, week) 
     self.save(:name => name, :sport => sport) 
     self.weeks.create(:id => "#{name}#{week}", :score => 0) 
    end 

end 

class Week 

    include DataMapper::Resource 
    property :id, String, :key => true 
    property :week, Integer 
    property :score, Integer 

    belongs_to :player 

end 

DataMapper.finalize.auto_migrate! 

Player.new("jack", "golf", 5) 
+0

코드 예제에 좀 더 많은 작업을 할 수 있습니까? 이것도 분석합니다. – mbj

+0

내 잘못, 내가 최종 및 초기화 물건을 넣어 야합니다. 그것은 어리석은 것처럼 보일지 모르지만 사람들이 왜 코드를 실행하여 IllegalContextError를 얻었는지 알 필요가 없다고 생각합니다. 나는 다음 번에 실수하지 않을 것입니다. – JoeyC

답변

0

나는 이것이 아마도 최선의 방법이 아니라는 것을 이해합니다. 따라서 제 방법을 저격하기 전에 더 나은 해결책을 제공하십시오. 아마 당신의 대답을 받아 들일 것입니다 :

그것은 data_mapper validators에서 발생한 IllegalContextError처럼 보입니다.

유효성 검사기의 data_mapper 문서는 유효성 검사기와 관련하여 문맥을 이해하는 초보자에게 많은 정보를 제공하지 않습니다.

내 해킹책입니다. bang 연산자 (!)를 사용하여 유효성 검사기를 재정의합니다. 해결책은 다음과 같습니다.

require 'data_mapper' 

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/prod.db") 

class Player 

    include DataMapper::Resource 
    property :name, String, :key => true 
    property :sport, String 

    has n, :weeks 

    def initialize(name, sport, week) 
     self[:name] = name 
     self[:sport] = sport 
     self[:week] = week 
     self.save! 
     self.weeks.create(:id => "#{name}#{week}", :score => 0) 
    end 

end 

class Week 

    include DataMapper::Resource 
    property :id, String, :key => true 
    property :week, Integer 
    property :score, Integer 

    belongs_to :player 

end 

DataMapper.finalize.auto_migrate! 

Player.new("jack", "golf", 5)