Правильный способ написать это условие - PullRequest
1 голос
/ 23 ноября 2010
unless @client.nil? 
  TestMailer.snap_shot_error("test1","Errors",
      {:file_name => File.basename(upload_file),:client_name => @client.client_name})
else
  TestMailer.snap_shot_error("test1","Errors",
      {:file_name => File.basename(upload_file))
end

def snap_shot_error(to_address,subject,options={})
  # code
end

<%  if @client_name %>
  <%= _("There were problems with file ") + @file_name + _(" for client ") + @client_name %>
<% else %>
  <%= _("There were problems with file ") + @file_name %>
<% end %>

1 Ответ

3 голосов
/ 23 ноября 2010

Для обоих этих квестов вы можете использовать троичный оператор.Это работает так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...