2016-09-23 3 views
3

Rubin 2.1.8 Schienen 3.2.18Rails Active bedingter Rückruf Ausgabe

Ich versuche, einen Rückruf zu laufen, wenn ein Datensatz nur dann, wenn ein bestimmtes Attribut gespeichert wird, wird geändert. Zum Beispiel

before_save :do_the_thing, if: :my_attr_changed? 

Allerdings, wenn ich my_attr und speichern ändern, wird do_the_thing nicht immer genannt. Und doch, wenn ich genau die gleiche Sache, aber mit:

before_save :do_the_thing 

def do_the_thing 
    puts my_attr_changed? 
end 

Es gibt „true“ in den Protokollen. Eher verwirrt hier. Jede Hilfe wird geschätzt. Vielen Dank.

+2

Was passiert, wenn Sie einen einen Lambda anstelle eines Symbols verwenden? 'before_save: do_the_thing, wenn: -> {my_attr_changed? } ' – max

+0

Obwohl die Verwendung eines Symbols hier funktionieren sollte. Haben Sie einen Test erstellt, der das Problem repliziert, und sind absolut sicher, dass der Fehler nicht in der Methodik enthalten ist? – max

+0

Symbol sollte funktionieren –

Antwort

4

bewegen Sie es einfach innerhalb Lambda

before_save :do_the_thing, if: -> { my_attr_changed? }