2012-07-26 5 views
0

Q & 서비스를 실행 중입니다. 관리자가 할 수있는 일 중 하나는 offtopic으로 질문을 표시하는 것입니다. 그들이 그렇게 할 때 이메일은 그 사람의 이메일에 도착하게됩니다.ActionMailer 요청 전달을 중단하려면 어떻게해야합니까?

이메일 알림 delayed_job를 통해 전송됩니다

QuestionMailer.delay.notify_asker_of_offtopic_flag question 

그러나, 때때로 누군가에 같은 논외 질문을 표시하거나 자신의 마음을 바꿀 실수 있습니다.

지연 호출 메일러 : 메일러 요청이 실행될 때 나는 짧은 지연을 만들고 문제는 여전히 논외 여부를 평가하려는 원래 묻는 사람에게가는 잘못된 알림을 방지하려면

QuestionMailer.delay(run_at: Time.now + 3.minutes).notify_asker_of_offtopic_flag(question) 

메일러 다음 if 블록은 단순히 오류 WHI가 발생하기 때문에

class QuestionMailer 
    ... 
    def notify_asker_of_offtopic_flag question 
    if question.offtopic? 
     # do mailing 
    end 
    end 
end 

불행하게도이 그렇게 간단하지 않다 그런 다음, ch는 delayed_job을 반복하여 작업을 다시 시도합니다.

같은 끝을 얻기 위해 꽤 둥근 방법을 실험하고 있지만 실제로는 오류를 트리거하지 않고도 QuestionMailer 동작을 중단하는 방법을 찾고 싶습니다. 이것이 가능한가?

답변

1

@ Aditya의 대답은 기본적으로 정확했지만 메일러 객체에 내 메소드를 유지하여 멋지고 깔끔하게 유지하려고했습니다. 이렇게하려면 몇 가지 추가 해킹이 필요했습니다.

는 인스턴스 메일러 방법을 취소하려고으로

문제를 지연 될 수 메일러의 새로운 클래스의 방법을 만들기는 본질적으로 렌더링이 중단되는 방법을 중지 다른 것들 트리거 점이다. 그러나 나는 여전히 모든 메일러 로직을 함께 유지하고자합니다.

내가 한 방법은 인스턴스 메서드 대신 클래스 메서드를 사용하는 것입니다. 이것은 ActionMailer 인스턴스에서 메서드를 호출 할 때의 차기 훅을 모두 피할 수 있지만, 여전히 지연 작업이 제외 작동

를 사용하여 함께

class QuestionMailer 
    ... 
    def notify_asker_of_offtopic_flag question 
    ... 
    end 

    def self.notify_asker_of_offtopic_flag question_if question 
    if question.offtopic? 
     QuestionMailer.notify_asker_of_offtopic_flag question 
    end 
    end 
end 

NB 수정 깔끔한 코드를 유지하기 위해 나를 허용 delayed_job을 처리하는 데 필요한 약간의 해킹이 필요합니다.

Mailer를 처리 할 때 delayed_job은 메일을 전달하기 위해 반환 된 객체에 항상 .deliver을 호출합니다. 메일 객체를 반환 할 때 괜찮습니다.하지만이 경우에는 nil을 반환합니다. 따라서 delayed_job.delivernil에 보내려고하면 모든 것이 실패합니다. 매우 도움이에 대한

class QuestionMailer 
    ... 
    class DummyMailer 
    def deliver 
     return true 
    end 
    end 

    def notify_asker_of_offtopic_flag question 
    # do mailing stuff 
    end 

    def self.notify_asker_of_offtopic_flag question_if question 
    if question.offtopic? 
     QuestionMailer.notify_asker_of_offtopic_flag question 
    else 
     DummyMailer.new 
    end 
    end 
end 
2

메일러를 지연시키지 마십시오. 다른 클래스 메서드를 귀하의 질문 클래스에서 아마도 지연시킬 수 있습니까? 질문의 ID를 전달하고 해당 지연된 방법으로 질문이 아직 만지면 확인하고, 예인 경우 전자 메일을 동 기적으로 보냅니다.

기본적으로 notify_asker_of_offtopic_flag를 질문 모델로 이동 한 다음 메일을 동기식으로 전송할 수 있습니다 (메소드의 이름을 변경해야합니다).

perform_deliveries를 코어의 메일 활동 자체에서 false로 설정하여 전달하는 것을 방지하는 것에 대한 이야기가 있지만, 결국 100 %가 아니거나 어떻게 끝날지 알 수 없습니다.

+0

감사합니다, 우리는 단순히 잘 속는 .deliver 방법을 포함하는 더미 메일러 개체를 반환이를 설명하기 위해

. 나가 갈 고려하고 있던 곳에이었다 그러나 더 청결한 방법이 있는지 확실하지 않았다 –

관련 문제