2015-05-13 3 views
11

У меня есть ниже фрагмент кода в одном из моих моделей AR:Рельсы проходят Params/аргументы функции обратного вызова ActiveRecord

after_update :cache_bust 

Метод cache_bust в модели принимает параметр (логическое), который устанавливает значение само по себе в false по умолчанию.

Как я могу передать true этому методу в модели из моего обратного вызова ActiveRecord, определенного выше?

Ex: after_update :cache_bust(true) не работает, потому что это символ, как я могу передать true параметру метода?

+1

Что определяет логическое значение? –

+0

Я хочу передать истину, если она вызвана через обратный вызов и не проходит через что-либо, если вызвано в другом месте. Я попытался использовать «вызывающий» Ruby, но он возвращает то же самое. – Noah

ответ

14

Существует четыре типа обратных вызовов, принятых макросами обратного вызова: ссылки на методы (символ), объекты обратного вызова, встроенные методы (с использованием proc) и встроенные методы eval (с использованием строки).

Попробуйте?

after_update -> { cache_bust(true) } 
+0

Работал, переключил свое принятие ответа, поскольку это решает проблему, а другой ответ - альтернатива. – Noah

-4

Короткий ответ: Нет. Вы не можете передавать какие-либо аргументы. Вы можете использовать attr_accessor для создания виртуального атрибута и установки этого атрибута.

+0

Это неверно. – jeffdill2

4

Основываясь на ваших разъяснений, вы можете добиться того, что вы ищете с помощью дополнительных параметров метода, например, так:

def cache_bust(callback = true) 
    ... method body 
end 

В сценарии, где метод вызывается из after_update обратного вызова, параметр не принят, но по умолчанию используется значение true. В противном случае, если метод вызывается из любого места «вручную», у вас есть возможность передать любое значение, которое вы хотите для этого метода.

+1

Это отвечает на фактический вопрос, который я искал в Google. – Dty

-1

Очень легко передать параметры от контроллера к обратному вызову, вы можете назвать имя params в модели. Пример:

В контроллере:

Quiz.create(name: 'abc') 

В модели:

before_create :valid_name? 

def valid_name? 
    puts name 
end 
+0

Это не сработало для меня в Rails 5 при вызове 'create' вне контроллера. – theUtherSide