2013-12-13 4 views
1

В моем приложении rails у меня есть модель с именем «Пользователь». У пользователя есть столбец электронной почты и столбец billing_email. Когда пользователь создает учетную запись, он вводит значение для user.email. Столбец billing_email остается пустым.Рельсы, если пустые, используйте другое значение

Внутри приложения я хочу использовать «user.email», если «user.billing_email» по-прежнему пуст. Поэтому, если пользователь не вводит значение для своей «user.billing_email», используется «user.email».

Может ли кто-нибудь указать мне в правильном направлении? И лучшее место для размещения такого кода? Внутри помощника или внутри самого user_model?

+0

Считаете ли вы использование 'user.email' для' billing_email' при сохранении в db, если его нет при создании? –

+0

Я действительно рассматривал это, но я предпочитаю, чтобы поля выставления счетов пустые, если пользователь этого не вводил. Если вы сохраняете user.email как user.billing_email в db, у меня возникают проблемы с другими кодами типа «если user.billing_email равно нулю». – Jerry

+0

Если вы уже хотите использовать обычное электронное письмо пользователя в качестве платежного адреса электронной почты, почему это имеет значение? Проверки на 'billing_email.nil?' Кажутся ненужными, если вы планируете иметь 'billing_email == email'. –

ответ

1

Override сорбент в модели:

def billing_email 
    super.blank? ? email : super 
end 

Но вы бы лучше использовать другое имя метода, или сохранить такое же имя, но и в качестве декоратора, например.

+0

Ну, это действительно показывает user.email, если user.billing_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 пуст, дублируя все значения.

Лучше идти с помощью специального метода.

Смежные вопросы