Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Обратный вызов Rails: используйте, если более одного раза в качестве условного в обратном вызове

Автор вопроса: RichardОтветов: 4

Я использую Rails 3.2.19, и у меня возникают проблемы при использовании более одного if в качестве условного оператора в обратном вызове.

Работает следующее смешанное двойное условие (оценивает first_condtion и second_condition)

after_save :after_save_method, unless: :first_condition?, if: :second_condition?

Но если я использую два условия if, метод after_save_method выполняется каждый раз. (Кажется, принимает только последнее условие)

after_save :after_save_method, if: :first_condition?, if: :second_condition?

Я также попытался объединить два условия с помощью "&&", но это не сработало.

after_save :after_save_method, if: :first_condition? && :second_condition?

Почему я не могу использовать if более одного раза?

В apidoc есть пример, если и если в http://edgeguides.rubyonrails.org/active_record_callbacks.html#multiple-conditions-for-callbacks, но ничего не говорит о недопустимости двух "если".

Мое решение для этого состояло в том, чтобы поместить весь необходимый код в метод и только оценить этот метод, но я просто хочу убедиться в if материале.

ruby-on-railsif-statementcallbackconditional

Ответы

Ответ 1 · рейтинг 5 · Lucas Moulin

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

after_save :after_save_method, if: :first_condition_and_second_condition?

private

def first_condition_and_second_condition?
  first_condition? && second_condition?
end

Ответ 2 · рейтинг 4 · Allam Matsubara

Как указано @tristanm здесь вы можете сделать что-то вроде этого:

before_save do
  if first_condition? && second_condition?
    after_save_method
  end
end

Это один из вариантов, предложенных @tristanm, проверьте его ответ, если вам нужен другой вариант.

Ответ 3 · рейтинг 4 · user3161928

Вы можете использовать Proc для этой цели.

after_save :after_save_method, :if => Proc.new{ first_condition? && second_condition? }

Ответ 4 · рейтинг 1 · Obie

Стоит отметить, что добавление двух отдельных условий if: не работает, потому что то, что вы передаете в качестве аргумента этому методу, является хэшем параметров Ruby. Второй if: перезаписывает первый.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы