2010-12-12 2 views
1

나는 수신 이메일을 처리하고 이메일을 처리하는 메소드를 빌드하고있다. 그 과정에서 이메일이 성공적으로 프로세스되는 것을 막을 수있는 많은 것들이 있습니다. 잘못된 회신 주소, 잘못된 주소, 비어있는 메시지 본문 등.레일 3 - 복잡한 Switch 문/문을 처리하는 방법

코드에는 Switch Statements (case/when/end) 및 If 문이 가득합니다. 더 똑똑하고 깨끗한 방법으로이 일을 배우고 싶습니다. 또한 오류를 추적 할 수있는 방법으로 오류가있는 전자 메일을 다시 보내는 위치가 있습니다. 레일과 함께 이런 일이 가능한가? 말 같은에서

@error = [] 

Case XXX 
when xxxx 
    if XXXXX 
    else 
    @error = 'You don't have permission to reply to the xxxxx' 
    end 
else 
    @error = 'Unfamilar XXXX' 
end 

그리고 뭔가 ... 여기에 도움을

If @errors.count > 0 
    Send the user an email letting them know what went wrong 
else 
do nothing 
end 

감사합니다. 위의 똑똑한 논리를 쓰는 법을 가르쳐 줄 다른 튜토리얼을 알고 있다면 그것은 좋을 것입니다. 지금은 3 단계 깊이로 진행되는 case/if 문이 있으므로 직선으로 유지하기가 어렵습니다.

감사합니다.

답변

2

예외를 사용하는 것이 좋습니다. this tutorial으로 시작한 다음 Google, 시행 착오를 사용하여 거기에서부터 시작하십시오.

편집 : 더 복잡한 경우 예외가 올바른 도구가 아닐 수도 있습니다. 당신은 (예를 들어 다른 답변을 참조), 대신 검증 기능을 사용할 수 있습니다, 또는 당신은, 중첩 IFS의 초기 대신 예컨대을 반환 할 수 : 일이 잘되지 않을 때

unless sender_valid? 
    @error = "Sender invalid" 
    return 
end 
unless subject_valid? 
    @error = "Invalid command" 
    return 
end 
# normal no-errors flow continues here... 
+0

내가보기 엔 예외를 선호하는 당신은 이런 식으로보고 할 수 있습니다. 메소드의 암시 적 종료는 대부분의 경우 정확히 원하는 것입니다. – aceofspades

+0

실제 예외를 처리 할 때만 예외를 사용하십시오. 예상 된 흐름 인 경우 예외를 사용하지 않는 것보다 좋습니다. 예를 들어 사용자가 입력 한 모든 데이터는 종종 잘못 될 것이므로 예외로 처리해서는 안됩니다. 코드를 정리하는 가장 기본적인 방법은 코드를 작은 논리적 덩어리 (메서드 및 클래스)로 나누는 것입니다. 중첩 된 사례 및 if를 갖는 것은 일반적으로 디자인 문제입니다. 이 경우에 예외를 사용하는 것은 단지 bandaid이지만 실제 해결책은 아닙니다. – iain

+0

복잡한 사례가있는 경우 예외를 사용하는 대신 유효성 검사기 함수로 추상화하는 것이 좋습니다. 당신의 선택에 무게를 둡니다. – moeffju

1

당신은 오류가 발생 할 수 있습니다. 그런 다음 방법의 끝에 그것을 잡으십시오.

http://phrogz.net/programmingruby/tut_exceptions.html

은 코드를 더 읽기 쉽게 및 스위치를 많이 가지고 있지 및/다음 문, 당신은 특정 측면을 확인하고 주요 오류 검사 방법에서 호출 별도의 방법을 만들 수 있습니다합니다.

+0

예외를 사용하면 최대 17 번 응용 프로그램이 느려질 수 있습니다. – mpapis

+0

@mpapis : Ruby의 경우 확실합니까? 참조 할 수 있니? – klew

+0

http://rpheath.com/posts/237-raising-custom-exceptions-in-rails - 덧글에 – mpapis

1

메시지를 모델에 매핑 할 수 있습니까? 모든 if/switch 논리는 유효성 검사이며 레일에 의해 자동으로 처리됩니다.

ErrorsDescription = { 
    :first => "First error", 
    :second => "Second error", 
    ... 
} 

및 사용 문자 대신 문자열을 : 좋은 출발점은 그냥 간단한 해시 각 오류 메시지에 대한 기호를 할당합니다, active record validations guide

은 또한 가치가 읽기 action mailer guide

3

처음이다.

그런 다음 if 및 switch 문. 기본적으로 당신이 어떤 종류의 조건 진술을 보지 못하기 때문에 당신을 정말로 도울 수는 없습니다. 너 뭐하니? 왜 3 단계 심층 조건이 있습니까? 아마도 if와 switch를 사용하여 더 간단하게 작성할 수 있습니다. 그래서이 문제에 대한 나의 첫 번째 대답입니다. 또 다른 해결책은 가독성을 높이기 위해 간단한 방법을 작성 할 수있다, 그래서 당신은 다음과 같이 쓸 수 있습니다 : 제안 @mpapis로

if @email.has_wrong_reply_to_address? 
    @errors << :wrong_reply_to_address 
else 
    ... 
end 

또한, 당신이 아니라 ActiveRecord로하지만 ActiveModel로, 레일 검증 시스템을 구축 할 수 있습니다. Here 당신은 그것을하는 방법과 그것이 작동하는 방법 (또한보십시오 here) 몇 가지 예제가 있습니다.물론 사용자 지정 유효성 검사를 작성해야 할 수도 있지만 단순한 메서드 일뿐입니다.

@email.valid? 

를 그리고 그렇지 않은 경우, 당신은 해시에서 모든 오류를 가지고 : 당신이 모든 일 이상 수행되면, 당신은 사용할 수 있습니다

@email.errors 

그냥 평범한 ActiveRecord 객체로.

그런 다음 오류가있는 경우 전자 메일을 보내는 send_error_email 메서드로 Emial 클래스를 확장 할 수 있습니다.

편집 :

이것은 덧글에 첨부 된 새로운 정보입니다.

중첩 된 if를 사용할 필요가 없습니다. 여기에서 전환하십시오.

def is_this_email_valid? 
    if !email_from_user_in_system? 
    @errors << :user_not_in_system 
    return false 
    end 
    if comment_not_exists? 
    @errors << :comment_not_exists 
    return false 
    end 
    if user_cannot_comment_here? 
    @errors << :permision_error 
    return false 
    end 
    ... 
    true 
end 

그런 다음 당신은 그것을 사용할 수 있습니다 :

if [email protected]_this_email_valid? 
    @email.send_error_mail 
end 
+0

고마워요. 깊이가 3 층으로가는 이유는. 먼저 전자 메일이 시스템의 사용자로부터 왔는지 확인합니다. 그럼 나는 그들이 존재하는 논평에 답하고 있는지 확인한다. 그런 다음 해당 주석에 회신 할 권한이 있는지 확인합니다. 그런 다음 주석이 공백/없음이 아닌지 확인합니다. 이해가 되니? – AnApprentice

+0

@AnApprentice : 네, 맞습니다. 그러나 왜 코멘트에 대한 회신은 메일을 통한 것인가? 당신은 이것을 위해 HTML 양식을 사용할 수 없습니까? – klew

+0

@AnApprentice : 일찍 나가시겠습니까? 예 : "메일이 유효한 사용자가 아닌 경우 오류를 반환합니다." – moeffju

관련 문제