Reputation: 6622
I would like to create a before_save
callback that only gets run if there have been changes to any (but not necessarily all) of the three fields (street, city, state). How do you do this? Thanks
user.rb
class User
before_save :run_test_method, :if => street_changed?
...
end
Upvotes: 9
Views: 5089
Reputation: 369
You can also use a lambda
:
before_save :run_test_method, if: ->(u) {u.street_changed? || u.something_changed? || u.something_else_changed?}
Upvotes: 1
Reputation: 27374
You can do it in one line using a Proc
:
class User
before_save :run_test_method, :if => Proc.new { |u| u.street_changed? || u.city_changed? || u.state_changed? }
...
end
Upvotes: 12
Reputation: 3357
Option One
You could create a method like:
def ok_to_run_test_method?
street_changed? || something_changed? || something_else_changed?
end
and then use:
before_save :run_test_method, :if => :ok_to_run_test_method?
Note how :ok_to_run_test_method?
is a symbol. Not sure if it was a typo or not but in your question you are actually calling a class method street_changed?
.
Option Two
Modernise your callbacks a little bit and use the block-style syntax:
before_save do
if street_changed? || something_changed? || something_else_changed?
# whatever you currently have in #run_test_method
end
end
Upvotes: 15