Рекомендации по правильному рефакторингу в утверждении Когда? - PullRequest
0 голосов
/ 03 марта 2011

Я пытаюсь вызвать две длинные команды в операторе when, но по какой-то причине из-за своего синтаксиса он выполняет две из команд дважды при его вызове:

  @email = Email.find(params[:id])
  delivery = case @email.mail_type
    # when "magic_email" these two delayed_jobs perform 2x instead of 1x. Why is that?
    when "magic_email"      then Delayed::Job.enqueue MagicEmail.new(@email.subject, @email.body)
                                 Delayed::Job.enqueue ReferredEmail.new(@email.subject, @email.body)
    when "org_magic_email"  then Delayed::Job.enqueue OrgMagicEmail.new(@email.subject, @email.body)
    when "all_orgs"         then Delayed::Job.enqueue OrgBlast.new(@email.subject, @email.body)
    when "all_card_holders" then Delayed::Job.enqueue MassEmail.new(@email.subject, @email.body)
  end
  return delivery

Как сделать так, чтобы при нажатии when "magic_email" оба этих отложенных задания отображались только один раз ?

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Вы звоните return delivery, и переменная доставки может иметь значение для повторного вызова отложенной работы. Это зависит от того, что возвращает оператор then, поэтому старайтесь ничего не возвращать, если это возможно. Я считаю, что вы хотите выполнить отложенную работу и ничего не возвращать с помощью функции.

Возможно, вы должны просто иметь case и не хранить его в любой переменной. Я имею в виду, что переменная доставки здесь не имеет смысла.

1 голос
/ 03 марта 2011

Я пробовал это на следующем примере:


  q = []
   a = case 1
   when 1 then  q.push 'ashish'
                q.push 'kumar'
   when 2 then  q.push 'test'
   when 4 then  q.push 'another test'
   end
   puts a.inspect #######["ashish", "kumar"]


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

...