2013-12-13 3 views
1

제 레일 어플리케이션에 "User"라는 모델이 있습니다. 사용자에게 열 이메일과 열 billing_email이 있습니다. 사용자가 계정을 만들면 user.email 값을 입력합니다. billing_email 열이 비어 있습니다.레일이 비어 있으면 다른 값을 사용하십시오

"user.billing_email"이 여전히 비어 있으면 "user.email"을 사용하고 싶습니다. 따라서 사용자가 "user.billing_email"값을 입력하지 않으면 "user.email"이 사용됩니다.

누군가가 올바른 방향으로 나를 가리킬 수 있습니까? 그리고 그러한 코드를 삽입하는 가장 좋은 장소는 무엇입니까? 도우미 내부 또는 user_model 내부?

+0

생성시 존재하지 않는다면 db에 저장할 때'billing_email'에'user.email'을 사용하는 것을 고려 했습니까? –

+0

나는 이것을 고려했다. 그러나 사용자가 이것을 입력하지 않으면 빌링 필드를 공백으로 유지한다. user.email을 db에 user.billing_email으로 저장하면 "user.billing_email이 nil"과 같은 다른 코드에 문제가 있습니다. – Jerry

+0

이미 청구 전자 우편으로 사용자의 일반 전자 메일을 사용하려는 경우 왜 중요합니까? 'billing_email.nil? '에 대한 체크는'billing_email == email'을 가지고있을 계획이라면 불필요한 것 같습니다. –

답변

1
은 모델에 게터를 오버라이드 (override)

:

def billing_email 
    super.blank? ? email : super 
end 

하지만 오히려 인스턴스에 대한 장식에 다른 방법 이름을 사용하거나 같은 이름을 유지하지만 것입니다.

+0

user.billing_email이 비어 있다면 실제로 이것은 user.email을 보여줍니다. 하지만 아마 더 잘 설명해야 할 것 같습니다. 사용자가 billing_email을 입력 할 수있는 양식이 있습니다. ".... 기본 이메일은 현재 결제 ...에 사용 중입니다 ..."라고 표시하고 앱은 user.email이있는 입력란을 표시합니다. 사용자가 "청구 전자 메일 편집"을 클릭하면 현재 user.email을 user.billing_email에 겹쳐 쓸 수 있습니다. 위 코드를 사용하면 앱에서 user.email도 변경됩니다. – Jerry

+0

결제 이메일을 변경하면 이메일이 변경되지 않습니다. – apneadiving

0

billing_email의 존재 여부를 확인한 다음이를 반환하는 새로운 방법을 만드는 것이 좋습니다. 그렇지 않으면 기본값으로 전자 메일을 보냅니다.

class User 
    def valid_email 
    billing_email.presence || email 
    end 
end 

당신은 billing_email

class User 
    def billing_email 
    read_attribute(:billing_email).presence || email 
    end 
end 

을 대체 할 수 있지만,이 모델이 저장되거나 표시됩니다 부작용으로 이어질 수 있기 때문에 일반적으로이 문제를 피할 수 있습니다.

실제로 어떤 경우에는 billing_email이 비어 있으면 모든 값을 복제하여 코드의 이메일 값을 저장할 수있는 경우가 있습니다.

맞춤 설정 방법을 사용하는 것이 좋습니다.

관련 문제