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

Я использую 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 материале.


person Richard    schedule 27.08.2014    source источник


Ответы (4)


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

after_save :after_save_method, if: :first_condition_and_second_condition?

private

def first_condition_and_second_condition?
  first_condition? && second_condition?
end
person Lucas Moulin    schedule 05.12.2016

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

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

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

person Allam Matsubara    schedule 04.03.2015

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

after_save :after_save_method, :if => Proc.new{ first_condition? && second_condition? }
person user3161928    schedule 07.03.2017
comment
если первое_условие? выполняет значение true, обратный вызов выполняется всегда. - person Luna Lovegood; 24.06.2019

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

person Obie    schedule 09.01.2017