2017-05-08 2 views
0

오케이,이 이상한 일을 발견했습니다. 내 사용자 모델에이 있습니다.두 개의 활성 레코드 콜백으로 레코드 업데이트

after_create :assign_role, :subscribe_to_basic_plan 

    def assign_role 
    self.role = 1 
    self.save 
    end 

    def subscribe_to_basic_plan 
    self.customer_id = "hello" 
    self.save 
    end 

(코드 설명을 위해 단순화)

내 사용자를 작성하고 내가 role: 1, customer_id: nil를 얻을 콘솔에서이를 확인

. 하지만!, 첫 번째 콜백에서 절약을 제거하면 모든 것이 잘 작동합니다.

after_create :assign_role, :subscribe_to_basic_plan 

    def assign_role 
    self.role = 1 
    end 

    def subscribe_to_basic_plan 
    self.customer_id = "hello" 
    self.save 
    end 

role: 1, customer_id: "hello"이다. 따라서 콜백에서 처음으로 .save 만 읽는 것처럼 보입니다. 나는 정확한 행동과 그 이유를 이해하고 싶습니다. 나는 이것을 찾아내는 데 많은 시간을 할애했고 비슷한 것을 다시 만나기를 원하지 않는다.

편집 :

아마도 도움이 될 것입니다. self.save를 사용할 때! in subscribe_to_basic_plan 오류가 발생하여 레코드가 저장되지 않습니다. self.save!을 assign_role에두면 아무 것도 변경되지 않으므로 문제는 두 번째 .save과 분명합니다.

+0

어떤 모델 유효성 확인이 있습니까? – Rose

+0

나는': validatable' 옵션과 함께 devise를 사용하고 있습니다. 그 너머에 아무것도. 그래서 기본적인 이메일과 패스워드 확인 – redFur

답변

1

이 답변은 확실하기 때문에 전체 모델 코드를 확인해야하므로 이론적 인 답변입니다.

대개 assign_role의 첫 번째 저장이 어떤 이유로 실패합니다. 실패하면 리턴은 콜백 이후의 모든 콜백을 건너 뜁니다. 그럼 두 번째 콜백은 전혀 실행되지 않습니다. 내 기본 설정 순서

가능한 솔루션 : 콜백을 사용하지 마십시오

  • . 모델을 저장하기 전에 컨트롤러에서 해당 값을 설정하십시오.
  • before_create를 사용하면 정확히 같은 모델을 연속으로 세 번 저장하지 않습니다.
  • 하나의 저장으로 두 콜백을 하나의 콜백으로 결합하십시오.
  • 유효성 검사가 실패 할 경우를 대비하여 save (validate : false)를 사용하여 저장하십시오.
+0

문제는 첫 번째 저장에있는 것처럼 보이지 않으며, 정상적으로 처리되고, 'save!'를 사용하면 오류가 발생하지 않습니다. 나는 당신이 뭔가 유효하다는 점에서 유효하다고 생각합니다. 'before_create'로 대체하고 모든 저장 작업을 제거하고 아마도 어쨌든 올바른 접근 방식 일 것입니다. 질문이 더 이론적이어서 왜 이것이 일어나고 있는지 묻습니다. 지금 당장은 열어 두겠습니다. – redFur