2011-01-09 5 views
3

나는 이것을 원한다 :이 명령어를 루비와 비슷한 방법으로 무엇입니까?

sender_email = @request.user.paypal_email if @request.user.paypal_email == "[email protected]" 

기본적으로 사용자 페이팔 이메일이 "[email protected]" 인 경우에만 명령을 실행하고 싶다. 이것은 잘 작동하지만 리팩터링 할 여지가있는 것처럼 보입니다.

+0

을 선호하는 경우에 훨씬 더 당신이 여기에 단지 부여 할 수 없다 할 수 그리고 Rails 'delegate' method

class User < ActiveRecord::Base has_many :requests end class Request < ActiveRecord::Base belongs_to :user delegate :paypal_email, :to => :user end 

사용을 고려 할 수 있습니다 당신의 예에서 당신이 가지고있는 것. 이 코드의 컨텍스트는 무엇입니까? 모델? –

+0

그 컨트롤러에서 – Trace

+0

그 후 sender_email로 무엇을합니까? 예를 들어 사용자가 정상적인 이메일을 가지고 있다면 어떻게 될까요? – kikito

답변

5

이 코드는 컨트롤러에 있으므로 리팩토링 할 수 있습니다. 일반적으로 단위 테스트를 작성하기 쉽고 사용자 모델에 대해 많이 알고있는 컨트롤러 작업이 아니기 때문에 일반적으로 모델과 같은 로직을 원합니다.

가 당신이 리팩토링 할 수있는 몇 가지 방법이 있어요,하지만 난 그렇게 같은 사용자 모델에 논리를 이동하는 것이 좋습니다 :

def User < ActiveRecord::Base 
    def sender_email 
    paypal_email if paypal_email == "[email protected]" 
    end 
end 

그런 다음 컨트롤러가 많이 알 필요가 없습니다 것이며, 다만 수 :

sender_email = @request.user.sender_email 
+0

코드가 OP 코드와 일치하지 않습니다. paypal_email! = "[email protected]"이라면 sender_email은 nil로 설정되지만 OP의 코드는 변경되지 않습니다. – adamax

+0

사실,하지만 리팩터링 될 수있는 그림이 더 많을 것입니다. 이 논리와 관련된 코드가 더 많습니다. 제 대답은 왜 모델 논리를 그것이 속한 곳으로 옮겨야하는지, 왜 어떻게해야하는지에 대한 예입니다. –

0

물론 블록을 사용하여 다시 작성할 수는 있지만 미래의 유연성이나 "가독성"만 다를뿐입니다. 어쩌면 당신의 질문은 "레일이 이것을하는 무언가를 제공합니까?"라고해야합니다. 그 질문에 대한 대답은 내가 아는 것이 아니다. 코드가 원하는대로 작동하면 변경해야 할 이유가 없습니다.

8
@request.user.paypal_email 

일부는 '하나 개의 점을 사용하는'것을 옹호한다. (See 'Law of Demeter'.) 당신은 당신이

@request.paypal_email 

를 작성하거나 당신이

class Request < ActiveRecord::Base 
    belongs_to :user 

    delegate :paypal_email, :to => :user, :prefix => true 
end 

@request.user_paypal_email 
관련 문제