2011-11-27 3 views
1

나는 장치, 팀 모델, 플레이어 모델 및 강사 모델이있는 사용자 모델을 가지고 있습니다. 나는 사용자가 가입 할 때 관련 팀이 관련 트레이너 및 플레이어와 함께 만들어지기를 원합니다. 나는 아래로 모델을 설정 한 :많은 관련 모델 만들기 before_save

user.rb

has_one :team 
has_one :trainer, :through => :team 
has_many :players, :through => :team 
accepts_nested_attributes_for :team, :allow_destroy => true 

before_save :create_team 

def create_team 
    @team = Team.new(params[:team]) 
    @team.user = self 
    @team.save 
end 

team.rb

belongs_to :user 
has_one :trainer 
has_many :players 
accepts_nested_attributes_for :trainer, :allow_destroy => true 
accepts_nested_attributes_for :player, :allow_destroy => true 

trainer.rb 및 player.rb

belongs_to :team 

내가하지 않은 나중에 사용자가 게임에서 그들을 선택하기를 원하기 때문에 create_trainer와 create_player 함수를 추가했다. 그래서 그들은 사용자 생성 과정에서 비어 있어야합니다.

그러나 가입 절차는 다음과 같은 오류 제공 :

No association found for name `trainer'. Has it been defined yet? 

을하고 라인을 참조 : team.rb.에서

accepts_nested_attributes_for :trainer, :allow_destroy => true 

팀 모델에 정의 된 강사의 존재 유무가 없다면 강사 항목을 아직 정의하지 않은 것은 무엇입니까? 그래서 아마 잘못,

morale.default => (5..12).to_a.sample 

하지만 더 오류를 준 : 내가 좋아하는 기본값으로 속성을 설정, 트레이너 모델에 몇 줄을 추가했습니다. 어떤 의견이라도 크게 고맙게 생각합니다. 특히 나는 멍청이이기 때문에 여기를 비꼬는 근거를 비판하는 것은 무엇이든합니다.

답변

1

몇 가지 :

망가 모델의 인스턴스 변수를 사용합니다. 사용자 모델에서 팀에 액세스하려면 team 또는 self.team을 사용하십시오.

사용자를 저장할 때마다 팀을 만들지 않으므로 before_save을 사용하지 마십시오.

귀하의 create_team 방법은 다음과 같아야합니다

after_create :my_create_team 

def my_create_team 
    create_team #create an empty team 
end 

그러나 새로운 팀에 대한 데이터는 사용자가 가입 한이 후 팀이 자동으로 accepts_nested_attributes_for :team이 있기 때문에 작성해야 할 때 이미 형태로 존재합니다.


내가 여기 코멘트에 몇 가지 질문에 대답하는거야 : 그래서

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one

을 당신이 지금이 모든 방법에 접근 한 has_one :team를 추가 할 때 (build_team, create_team 팀 = etc)

"비어 있음"으로, 나는 방금 속성이없는 create_team을 호출하면 "기본"팀을 만들 것입니다. 이름 등은 없지만 사용자에게 연결될 수 있습니다.

는 그냥 "빈"팀을 만들고 싶었 경우, 당신은 단지이 할 수있는 생각 :

after_create :create_team 

당신이 기본 매개 변수를 전달할 수 있도록 할 자신 만의 방법을 만들기.

하지만 팀 이름에 유효성 검사와 같은 유효성 검사를 추가했을 것입니다. 어쨌든 accepts_nested_attributes_for :team, :allow_destroy => true이 (가) 있으니 가입 양식에 사용자 팀에 필수 입력란이있는 경우 자동으로 팀을 만들어야합니다.

+0

답변 해 주셔서 감사합니다. 나는 컴퓨터 사용자 일 뿐이므로 용어에 적응하기가 어렵다. 나는 [ActiveRecord Associations] (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)를 확인하고 단 하나의 연결 (일대일)에서 create_other (속성 = {})를 보았습니다. 이것은 create_team과 같은 함수입니까? 그렇다면 create_team이 빈 팀을 생성한다는 사실을 알려주는 라인이 없습니다. 실용적인 정보를 어디에서 얻을 수 있는지 말해 주시겠습니까? 아니면 모든 프로그래머가 알아야 할 사소한 일입니까? – barerd

+0

팀 생성에 실패하면 사용자 생성이 성공하지 않습니까? 그 의존성을 달성하는 올바른 방법은 무엇입니까 (팀 생성 실패시 사용자 생성 실패)? – aciniglio