Для обоих этих квестов вы можете использовать троичный оператор.Это работает так:
condition ? value_if_true : value_if_false
Это выражение (последовательность значений и операторов, которая создает другое значение).Он определяет, является ли условие истинным или ложным, и оценивает первое значение (после? И перед символом :), если условие истинно, и второе значение (после :), если условие ложно.
Итак, для первого примера кода, который вы опубликовали, вы можете сделать это:
TestMailer.snap_shot_error("test1", "Errors",
:file_name => File.basename(upload_file),
:client_name => @client ? @client.client_name : nil)
[Обратите внимание, что я удалил фигурные скобки вокруг параметров - в Ruby нет необходимости для финальногохэш опций, и это идиоматично, чтобы оставить их выключенными]
Или, если по какой-то причине вам даже не нужен nil: client_name в хэше, вы можете использовать троичный оператор и объединение:
TestMailer.snap_shot_error("test1", "Errors",
{:file_name => File.basename(upload_file)}.merge(
@client ? { :client_name => @client.client_name } : {}))
Для представления вы также можете использовать троичный оператор:
<%= _("There were problems with file ") + @file_name +
(@client_name ? _(" for client ") + @client_name : '' ) %>
И теперь, когда я вижу, что вы делаете с @client_name, я не понимаю, почему вы сказали, что вам требуетсячто это даже не будет в хеше.Первый пример кода, который я разместил, где он передает «: client_name => @ client.client_name», если есть клиент и передает «: client_name => nil», если нет клиента, должен работать просто отлично.Нет причин не передавать: client_name вместо того, чтобы просто передать nil: client_name.